HashSet的底层是如何实现的?请说一下原理
HashSet
是Java集合框架提供的一种不允许有重复元素的无序集合。它实际上是通过内部维护一个HashMap
来实现的。
HashMap
是基于哈希表的数据结构,它主要由数组和链表(或树)组成。实际上,在Java 8中,当链表的长度超过一定数量(默认为8),链表就会转化为红黑树,以提高性能。
现在我们来看一下HashSet
的具体工作过程:
- 当你添加一个元素到
HashSet
中时,HashSet
实际上会调用内部的HashMap
的put(key, value)
方法来存储这个元素。HashSet
中的元素实际上被存储在HashMap
的键中,而HashMap
中对应的值则是一个固定的Object
对象,由HashSet
自己定义。 -
在添加元素时,
HashSet
会计算元素的hashCode()
方法返回的哈希值,以决定它在内部HashMap
中的存储位置。如果两个元素的hashCode()
相同,那么HashSet
会通过equals()
方法来检查这两个元素是否真的相等。如果equals()
返回true
,则新添加的元素不会被保存,因为HashSet
不允许有重复元素。 -
在查找一个元素时,
HashSet
也会计算这个元素的hashCode()
,然后在HashMap
中查找这个哈希值对应的元素。 -
删除元素时,也是先计算元素的
hashCode()
,然后找到在HashMap
中的位置,再进行删除。
通过这种方式,HashSet
可以通过hashCode()
的非常快速的计算和查找,实现几乎常数时间的添加、删除和查找操作,但这种高性能是以牺牲元素排序为代价的。