HashSet 的底层实现是 HashMap
    public HashSet() {
        map = new HashMap<>();
    }
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;  ===》所以可以放入null,但只能放入一个null,数据不能重复。
    }
TreeSet 的底层实现是TreeMap
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
    public boolean add(E e) {
        return m.put(e, PRESENT)==null; ===》同hashSet一样,添加的是map的key值, key值不能相同,所以数据不能重复。
}
HashMap 和TreeMap的区别。
HashMap是哈希表结构实现的,TreeMap是二叉树结构实现的。
HashMap 添加数据是没有顺序的添加
而TreeMap的添加数据则是
public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // type (and possibly null) check  ====》实现Comparator 进行排序。
            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
所以HashMap是无序的,而TreeMap是有序的存储数据的。
同理 HashSet是无序的,Tree是有序的。
原文:http://www.cnblogs.com/zhangyongsic/p/7569336.html