hashset内部使用hashmap存储元素,元素作为key,值为固定占位符,利用hashmap键的唯一性保证元素不重复;2. 其add、remove、contains操作依赖hashcode()和equals()方法正确实现,否则会导致逻辑重复或查找失败;3. 性能平均o(1),适用于需快速判断存在性且无需顺序的场景;4. 与arraylist(有序可重复,索引访问快)和treeset(有序唯一,o(log n)性能)相比,hashset在无序唯一集合中查找最快。

HashSet
HashMap
HashSet
HashMap
java.lang.Object
PRESENT
HashMap
HashSet
HashMap

HashSet
HashMap
add(E e)
HashSet
map
put(e, PRESENT)
HashMap
put
e
hashCode()
e
equals()
e
e
HashMap
e
HashSet
同样地,
contains(Object o)
map.containsKey(o)
o
hashCode()
equals()
remove(Object o)
map.remove(o)

所以,
HashSet
HashMap
hashCode()
equals()
HashSet
在我看来,如果你想让
HashSet
hashCode()
equals()

简单来说,Java 规范要求:
equals()
hashCode()
equals()
hashCode()
现在我们想想,如果这个契约被打破了,会发生什么? 假设你有一个
Person
name
age
equals()
hashCode()
Person
HashSet
hashCode()
Object
hashCode()
equals()
true
hashCode()
HashSet
HashMap
HashSet
反过来,如果你只重写了
hashCode()
equals()
equals()
false
equals
HashSet
所以,每一次当你创建一个自定义类,并且打算将它的实例作为
HashSet
HashMap
hashCode()
equals()
HashSet
HashSet
HashSet
add
remove
contains
然而,这种 O(1) 的理想情况并非绝对。如果哈希函数设计得不好,或者数据本身分布极端,导致大量元素哈希到同一个桶里,那么这个桶就可能变成一个很长的链表(或红黑树,Java 8 以后),此时操作的时间复杂度就会退化到 O(n),和
ArrayList
具体到适用场景:
HashSet
HashSet
contains()
HashSet
但要注意,
HashSet
ArrayList
HashMap
PRESENT
HashSet
ArrayList
TreeSet
当我们谈论 Java 集合时,
HashSet
ArrayList
TreeSet
1. HashSet
HashMap
add
remove
contains
HashSet
2. ArrayList
get(index)
add(element)
contains
ArrayList
3. TreeSet
TreeMap
Comparable
Comparator
add
remove
contains
TreeSet
HashSet
总的来说,选择哪个集合,关键在于你对“顺序”、“唯一性”和“性能”这三个维度的具体需求。没有哪个是“最好”的,只有“最适合”你当前场景的。
以上就是说一下 HashSet 的实现原理?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号