Set接口
java.util.Set
接口和
java.util.List接口一样,同样继承自
Collection
接口,它与
Collection
接口中的方法基本一致,并没有对
Collection
接口进行功能上的扩充,只是比
Collection
接口更加严格了。与
List
接口不 同的是, Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set
集合有多个子类,这里我们介绍其中的
java.util.HashSet、
java.util.LinkedHashSet
这两个集合 :Set
集合取出元素的方式可以采用:迭代器、增强
for
。1.1 HashSet集合介绍
java.util.HashSet
是
Set
接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的
(
即存取顺序 不一致)
。
java.util.HashSet
底层的实现其实是一个
java.util.HashMap
支持,由于我们暂时还未学习,先做了 解。 HashSet
是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:
hashCode
与
equals
方法。1.2HashSet集合存储数据的结构(哈希表)
什么是哈希表呢?在
JDK1.8
之前,哈希表底层采用数组
+
链表实现,即使用链表处理冲突,同一
hash
值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即
hash
值相等的元素较多时,通过
key
值依次查找的效率较低。而
JDK1.8
中,哈 希表存储采用数组+
链表
+
红黑树实现,当链表长度超过阈值(
8
)时,将链表转换为红黑树,这样大大减少了查找时间。哈希表是由数组
+
链表
+
红黑树(
JDK1.8
增加了红黑树部分)实现的 总而言之,
JDK1.8
引入红黑树大程度优化了
HashMap
的性能,那么对于我们来讲保证
HashSet
集合元素的唯一,其实就是根据对象的
hashCode
和
equals
方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写
hashCode
和
equals
方法建立属于当前对象的比较方式。 1.3HashSet存储自定义类型元素
给
HashSet
中存放自定义类型元素时,需要重写对象中的
hashCode
和
equals
方法,建立自己的比较方式,才能保证
HashSet
集合中的对象唯一 1.4LinkedHashSet
我们知道
HashSet
保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?在
HashSet
下面有一个子类
java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class Test222 {public static void main(String[] args) {
Set set = new LinkedHashSet();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
【Set接口】输出
文章图片
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 2020-04-07vue中Axios的封装和API接口的管理
- 调取接口时报404错误(ID:16)
- CICC(脑机接口,科幻几近成真())
- Swift中willSet和didSet的简述
- 接口|axios接口报错-参数类型错误解决
- 190403|190403 - Jmeter压测接口
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- 微信小程序请求接口格式