前言
今天学习java基础类型Set,解剖Set的底层实现。
一、Set子类
Set接口继承自Collection接口,存放不重复的一组数据,根据是否需要排序,可以分别选用HashSet或者TreeSet,其中HashSet用于无序存储场景,而TreeSet有序保存数据。
Collection
└Set
├HashSet
│ └LinkedHashSet
└SortedSet
└NavigableSet
└TreeSet
1.1 HashSet与LinkedHashSet
HashSet底层使用HashMap作为存储的数据结构(关于Map结构下期会详细说明),key为对象本身,value为一个空的Object对象。LinkedHashSet与HashSet类似,只是基础数据结构由HashMap变成了LinkedHashSet而已。
public HashSet() {
map = new HashMap<>(); //初始容量16,加载因子0.75
}
public HashSet(int initialCapacity);
public HashSet(int initialCapacity, float loadFactor);
HashSet(int initialCapacity, float loadFactor, boolean dummy); //构建LinkedHashSet
public HashSet(Collection<? extends E> c); //从其他集合构建Set
//添加数据,首次添加返回true,否则返回false
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
1.2 SortedSet、NavigableSet和TreeSet
SortedSet和NavigableSet接口主要提供排序Set的取值或者取子集,具体实现可以参考TreeSet。(根据接口说明可以发现有序结合为升序排列)
// SortedSet
SortedSet<E> subSet(E fromElement, E toElement); //某个范围的子集
SortedSet<E> headSet(E toElement); //小于toElement的子集
SortedSet<E> tailSet(E fromElement); //大于等于fromElement的子集
E first(); //返回第一个元素
E last(); //返回最后一个元素
// NavigableSet
E lower(E e); //小于e的子集
E floor(E e); //小于等于e的子集
E higher(E e); //大于e的子集
E ceiling(E e); //大于等于e的子集
E pollFirst(); //返回第一个元素并移除
E pollLast(); //返回最后一个元素并移除
二、总结
查看源码后发现Set底层主要是有Map结构实现,今天作为一个引子,简单介绍Set的主要方法和分类,后续会补充Map的详细介绍。