java.util.Set
接口和
java.util.List
接口一样,同样继承自
Collection
接口,它与
Collection
接口中的方
法基本一致,并没有对
Collection
接口进行功能上的扩充,只是比
Collection
接口更加严格了。与
List
接口不
同的是,
Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
HashSet
集合介绍
java.util.HashSet
是
Set
接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的
(
即存取顺序
不一致
)。java.util.HashSet
底层的实现其实是一个
java.util.HashMap
支持
HashSet
是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性
的方式依赖于:
hashCode
与
equals
方法。
HashSet
集合存储数据的结构(哈希表)
什么是哈希表呢?
在
JDK1.8
之前,哈希表底层采用数组
+
链表实现,即使用链表处理冲突,同一
hash
值的链表都存储在一个链表里。
但是当位于一个桶中的元素较多,即
hash
值相等的元素较多时,通过
key
值依次查找的效率较低。而
JDK1.8
中,哈
希表存储采用数组
+
链表
+
红黑树实现,当链表长度超过阈值(
8
)时,将链表转换为红黑树,这样大大减少了查找
时间。
哈希表是由数组
+
链表
+
红黑树(
JDK1.8
增加了红黑树部分)实现的
HashSet
存储自定义类型元素
@Override
public
boolean
equals
(
Object
o
) {
if
(
this
==
o
)
return
true
;
if
(
o
==
null
||
getClass
()
!=
o
.
getClass
())
return
false
;
Student student
=
(
Student
)
o
;
return
age
==
student
.
age
&&
Objects
.
equals
(
name
,
student
.
name
);
}
@Override
public
int
hashCode
() {
return
Objects
.
hash
(
name
,
age
);
}
LinkedHashSet
在
HashSet
下面有一个子类
java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。