Set集合是基于HashCode还是equals实现的?
关于Set判断元素唯一性:hashCode与equals的协作逻辑
真相是:这两个答案都不完整——以最常用的HashSet为例,它是**同时依赖hashCode()和equals()**来保证元素唯一性的,二者是协作关系,缺一不可。
具体执行逻辑:
- 当向Set中添加元素时,首先会调用该元素的
hashCode()方法计算哈希值,以此定位到对应的哈希桶位置。 - 如果该哈希桶为空,直接将元素加入;如果桶内已有元素,则对桶内的每个元素依次调用
equals()方法进行比较。 - 只要有一个元素与新元素的
equals()返回true,就判定为重复元素,拒绝添加;若所有元素的equals()都返回false,则将新元素加入桶中。
额外补充:
- 若仅重写
equals()但不重写hashCode(),会导致两个逻辑相等的元素(equals返回true)拥有不同哈希值,被分配到不同哈希桶,Set会将它们视为不同元素,破坏唯一性。 - 若仅重写
hashCode()但不重写equals(),当出现哈希碰撞(不同元素哈希值相同)时,equals()会返回false,Set会把这些元素都加入,同样不符合唯一性要求。 - 对于
TreeSet这类基于排序逻辑的Set,它依赖的是compareTo()方法(或自定义Comparator)来判断元素是否重复,与hashCode()和equals()无关,但面试场景中讨论的通常是HashSet。
内容的提问来源于stack exchange,提问作者Dzak
相关产品推荐
相关产品推荐

