Set/HashSet/LinkedHashSet/TreeSet

HashSet

应用场景:数据去重复
继承关系:HashSet继承于AbstractSet,AbstractSet继承于AbstractCollection实现了Set,克隆,有序化接口.
特点:
数据重复性:不能重复,底层基于HashMap,HashSet存储的值就是HashMap的Key,所以是不能重复的
null值处理:只能存储一个null值
只能存储单个数据,HashSet的底层是HashMap,HashSet用一个对象存储在所有的value中,所以只能key值存储数据.
数据有序性:无序的

常用方法:
contains(Key):传入的是一个key,底层调用map.containsKey方法.(返回是否含有)
add(e):传入的作为key,value统一用PRESENT遍历,底层调用map.put方法(返回插入的是否为null)
remove(e):传入的作为key,底层调用map.remove方法(返回移除的是否为PRESENT)
removeAll(<?> c):传入的是一个集合,在当前集合中移除与传入集合相同的数据
addAll(<?> c):传入的是一个集合,把传入的集合中所有数据添加到当前集合中
retainAll(<?> c):在当前集合中只保留 既存在于传入集合,也存在于当前集合的数据(求交集)
遍历方式:底层调用的是HashMap的keySet的迭代器
底层数据结构:是一个HashMap
构造函数:
1.默认的,直接新创建一个HashMap,都用的是默认值.
2.参数是自定义的 初始容量和加载因子
3.参数是自定义的初始容量,加载因子是默认值0.75
4.参数是自定义的初始容量,加载因子,和一个boolean值
5.参数是一个集合
属性;
private static final Object类型的PRESENT 只是用作虚拟的value进行存储
HashMap 类型的 map
增长方式:
类似于HashMap的二倍扩容

LinkedHashSet

继承关系:类似于HashSet

构造函数:和HashSet一样,底层调用的是父类HashSet带三个参数的构造函数,并且第三个值默认都为true,即按照插入有序

实现访问有序是如何实现的?
底层的四个构造函数,都是调用super(HashSet)的构造函数带三个参数的构造函数,导致map为LinkedHashMap,而LinkedHashMap的accessOrder为true,就是访问有序

TreeSet

底层封装的是一个TreeMap.
能够实现数据排序,如何实现排序??
1.自然排序,
让元素所属的类实现Comparable接口
在类中重写Comparable的抽象方法compare To()
2.创建比较器类
实现Comparator接口
重写compare方法
3.创建匿名对象类

猜你喜欢

转载自blog.csdn.net/weixin_43584947/article/details/83934145