HashSet 在 Java 中检查重复元素的方式如下:
-
哈希码计算:
当一个对象被尝试添加到 HashSet 中时,首先调用该对象的hashCode()
方法计算其哈希码。根据这个哈希码确定对象在集合内部存储数组中的索引位置。 -
开放地址法或链地址法:
- 对于哈希表冲突(即多个对象具有相同的哈希码),Java 的 HashSet 实现(基于 HashMap)使用链地址法来处理冲突,即将具有相同哈希码的对象链接在一个桶(bucket)中。
- 如果目标索引位置上没有元素,那么直接将新元素添加到该位置。
-
equals() 检查:
- 如果目标索引位置上已经有元素存在,则需要进一步比较。遍历该位置上的链表(或者红黑树,在JDK1.8及以后版本,当链表长度超过一定阈值时会转换为红黑树以优化性能),对每个已经存在的元素调用
equals()
方法与待插入对象进行比较。 - 如果找到任何一个已存在的元素与待插入对象通过
equals()
方法判断为相等,则认为是重复元素,HashSet 不会将该对象添加进去。
- 如果目标索引位置上已经有元素存在,则需要进一步比较。遍历该位置上的链表(或者红黑树,在JDK1.8及以后版本,当链表长度超过一定阈值时会转换为红黑树以优化性能),对每个已经存在的元素调用
综上所述,HashSet 通过结合对象的 hashCode()
和 equals()
方法来确保集合内不会出现重复元素。即使两个不同对象可能有相同的哈希码,只有当它们也通过 equals()
方法判断为相等时才会被认为是重复项。