黑马程序员技术交流社区

标题: Set中如何保证元素的唯一性 [打印本页]

作者: Quasimodo2    时间: 2016-10-20 23:38
标题: Set中如何保证元素的唯一性

Set中如何保证元素的唯一性 在Set里如果保证其中元素的唯一型:
我们来看看 Set的一个实现HashSet中的add方法,HashSet内部使用一个HashMap来存放对象,
HashSet把要保存的对象做为其内部HashMap的key,如下:
Java代码 X
//PRESENT为一个辅助的Object型对象 public boolean add(E o) { return map.put(o, PRESENT)==null; }
//PRESENT为一个辅助的Object型对象 public boolean add(E o) { return map.put(o, PRESENT)==null; } 如果有两个对象A,B, A.equals(B)返回ture,则
A和B只会有一个被保存在set中。
在HashMap中判断两个key相同的逻辑是 hashcode()相等并且 equals()返回true。
再看看HashMap中的put()
Java代码
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry e = table; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry e = table; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
刚好看到另外一个帖子,http://www.javaeye.com/topic/123202
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 中,只有hashcode相等时
才会调用后面的key.equals(k)

作者: star皆空    时间: 2016-10-21 00:05
鼓励一下

作者: yu244934256    时间: 2016-10-21 00:19
是的,当hashCode的值不相等在判断equals,减少判断次数
作者: 奕明传媒    时间: 2016-10-21 00:24
简单重复一次:Set的子类HashSet内部其实有个HashMap对象,Set用add()方法HashMap存储对象
作者: 奕明传媒    时间: 2016-10-21 00:26
简单重复一次:Set的子类HashSet内部其实有个HashMap对象,当HashSet调用add()方法时,顺便调用hashCode()方法和equals()方法,如果hashCode返回false,则将要添加的对象作为该HashMap对象的键来存,
作者: wgc    时间: 2016-10-21 23:45
干的不错6666666666

作者: LXD2016    时间: 2016-10-21 23:46
6666666666





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2