为何数据相同的不同HashSet实例哈希码相同?代码判断是否有效?
关于HashSet哈希码与等值判断的问题
为什么数据相同的不同HashSet对象哈希码会相同?
Java里的HashSet类重写了hashCode()方法,它的计算逻辑是遍历集合中所有元素,累加每个元素的哈希码值。由于HashSet是无序集合,只要两个集合包含的元素完全一致(不考虑顺序),它们的元素哈希码总和就会相等,最终两个HashSet对象的哈希码自然相同。
比如单词"eat"和"tea"对应的字符HashSet都是{'e','a','t'},遍历这三个字符累加哈希码的结果完全一样,所以两个HashSet的哈希码就相同。
if(set1.hashCode() == set2.hashCode()) doStuff()这样的代码是否有效?
这种写法不能直接用来判断两个集合是否等价,只能作为快速过滤的前置手段。
核心原因是哈希碰撞的存在:不同的集合(元素构成不同)有可能算出相同的哈希码。比如集合{1, 2}的哈希码是1+2=3,集合{3}的哈希码也是3,这时候hashCode()相等,但两个集合完全不同。
如果你的需求是判断两个集合是否真的相等(元素完全一致),必须用set1.equals(set2)——HashSet的equals()方法会逐一检查两个集合的元素是否全部匹配,这才是可靠的判断方式。
回到你解决字母异位词分组的场景,嵌套HashSet的方法之所以可行,本质是因为异位词对应的字符集合调用equals()会返回true,而外层用来分组的容器(比如HashMap)在判断键是否存在时,会先比较哈希码快速筛选,再用equals()做最终验证,所以最终能正确完成分组。
内容的提问来源于stack exchange,提问作者Tydal
相关产品推荐
相关产品推荐

