一:HashSet
1、特征
1)HashSet 是一个没有重复元素的集合
2)不保证元素的顺序,而且HashSet允许使用 null 元素
3)HashSet是非线程安全的
2、原理
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { static final long serialVersionUID = -5024744406713321676L; // HashSet是通过map(HashMap对象)保存内容的 private transient HashMap<E,Object> map; // PRESENT是向map中插入key-value对应的value // 因为HashSet中只需要用到key,而HashMap是key-value键值对; // 所以,向map中添加键值对时,键值对的值固定是PRESENT private static final Object PRESENT = new Object(); ...... }
原理很简单:HashSet中通过一个HashMap成员来保存数据,其中set的元素就是hashMap的key,而值则恒定使用一个final成员object对象来占位。
由于hashMap的key是不允许重复的,因此保证了HashSet的元素不重复。
二:TreeSet
1、特征
1)TreeSet 是一个有序的集合
2)TreeSet是非线程安全的
2、原理
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable { // NavigableMap对象:此处使用了多态,实际上它指向一个TreeMap实例 private transient NavigableMap<E,Object> m; // TreeSet是通过TreeMap实现的, // PRESENT是键-值对中的值。 private static final Object PRESENT = new Object(); // 不带参数的构造函数。创建一个空的TreeMap public TreeSet() { this(new TreeMap<E,Object>()); } // 将TreeMap赋值给 "NavigableMap对象m" TreeSet(NavigableMap<E,Object> m) { this.m = m; } // 带比较器的构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<E,Object>(comparator)); } ...... }
原理很简单:TreeSet中使用了一个 NavigableMap 成员,它是TreeMap的基类,在构造函数中可以传入比较器创建一个TreeMap来存储set的元素并且借助treeMap的比较器来保证有序。