A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Quasimodo2 中级黑马   /  2016-10-20 23:38  /  1287 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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)
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端

6 个回复

倒序浏览
回复 使用道具 举报
是的,当hashCode的值不相等在判断equals,减少判断次数
回复 使用道具 举报
简单重复一次:Set的子类HashSet内部其实有个HashMap对象,Set用add()方法HashMap存储对象
回复 使用道具 举报
简单重复一次:Set的子类HashSet内部其实有个HashMap对象,当HashSet调用add()方法时,顺便调用hashCode()方法和equals()方法,如果hashCode返回false,则将要添加的对象作为该HashMap对象的键来存,
回复 使用道具 举报
wgc 中级黑马 2016-10-21 23:45:48
地板
回复 使用道具 举报
LXD2016 中级黑马 2016-10-21 23:46:14
7#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马