Set集合,我们常见的Set有HashSet,TreeSet,LinkedHashSet,我们先来看下HashSet。
成员变量: 成员变量只有可怜的两个,一个是装数据的容器,一个类似于标记
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object();数据操作方法: 我们从添加/移除方法可以看出HashMap是以(Key,value)的形式来进行存储,HashSet是以(E,PRESENT)的形式保存数据,也就是说它保存的数据为对象,PRESENT就类似于当前HashSet的标记。
public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; }我们来看下LinkedHashSet的继承机构,构造方法,我们可以看到LinkedHashSet的底层为LinkedHashMap,也就是他在保存数据都会以map.put(e, PRESENT)的形式来看。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {} public LinkedHashSet() { super(16, .75f, true); } HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }总结:
HashSet的底层为HashMap,保存的数据为一个对象,保存数据时的key为数据,value为PRESENT,一个HashSet的静态变量,但不会保证元素的有序性。LinkedHashSet的底层为LinkedHashMap,对比与HashSet的区别就是使用双向链表来保证数据的有序性TreeSet的底层为TreeMap,TreeMap的底层为红黑树,存放的元素也为单个对象,可以进行排序操作,元素不能进行重复。