栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在添加到HashSet和hashCode匹配项时未调用equals()?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在添加到HashSet和hashCode匹配项时未调用equals()?

哈希集首先检查引用相等性,如果通过,则跳过该

.equals
调用。这是一个优化和工作,因为合同
equals
,如果指定
a ==b
然后
a.equals(b)

我在下面附加了源代码,并突出显示了此检查。

相反,如果添加两个不相同引用的相等元素,则会获得预期的效果:

    HashSet st1=new HashSet();    st1.add(new Student(89));    st1.add(new Student(89));    System.out.println("Ho size="+st1.size());

结果是

$ java Test1Hello-hashpreHello-hashpreHello-equalsHo size=1

这是来自OpenJDK 7的源代码,其中指明了相等性优化(来自HashMap的基础实现HashMap):

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<K,V> e = table[i]; e != null; e = e.next) {        Object k;//        v-- HERE        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;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496762.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号