HashSet 和 TreeSet
一、HashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable{
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>(); // 底层数据结构是hashMap
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
}
1、HashSet 基于 HashMap 来实现的,
2、HashSet 允许有 null 值。
3、HashSet 是无序的,即不会记录插入的顺序。
4、HashSet 是一个不允许有重复元素的集合,重复元素不会被添加
二、TreeSet
TreeSet 大致的结构和 HashSet 相似,底层组合的是 TreeMap,所以继承了 TreeMap key 能够排序的功能,迭代的时候,也可以按照 key 的排序顺序进行迭代。
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
public TreeSet() {
this(new TreeMap<>()); //底层使用TreeMap实现
}
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
}
1、TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
2、和 HashSet 不同的是,TreeSet 可以实现从头或从尾进行遍历,这时是 TreeSet 定义接口,让 TreeMap 去实现的。
3、向树集添加空值TreeSet根据其自然顺序向其中添加元素。这将使用compareTo(或compare)方法在内部将元素相互比较。如果尝试使用这些方法之一比较具有空值的任何对象,则将引发NullPointerException。
Set<String>set = new TreeSet<>();
System.out.println("set:"+set);
set.add(null); // Exception in thread "main" java.lang.NullPointerException
set.add("a");
for (String s : set) {
System.out.println("value:"+s);
}