Java集合包(十)——Set的两个实现类

一: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的比较器来保证有序。

    

原文地址:https://www.cnblogs.com/ygj0930/p/13577901.html