浏览 2142 次
锁定老帖子 主题:Set中如何保证元素的唯一性
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-07
我们来看看 Set的一个实现HashSet中的add方法,HashSet内部使用一个HashMap来存放对象, HashSet把要保存的对象做为其内部HashMap的key,如下: //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() 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[i]; e != null; e = e.next) { Object k; /** * 因为A.equals(B)为true,故A.hashCode() == B.hashCode(); * 故会进入到下面的if块内部,从而保证了A和B只有一个被保存在Set里 */ 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.iteye.com/topic/123202 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 中,只有hashcode相等时 才会调用后面的key.equals(k) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |