Collection set

HashSet:
HashSet是采用hash表算法来实现的,其中的元素没有按顺序排列,主要有add()、remove()以及contains()等方法;
add 方法实际调用hashmap put (map =new LinkedHashMap)
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    private transient HashMap<E,Object> map;
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
}
 
demo:
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(1);
hashSet.add(1);
hashSet.add(3);
 
hashSet.remove(3);
for (Integer var : hashSet) {
    System.out.println(var);
}
1
 
TreeSet :
public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable
{}
TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
TreeSet是采用树结构实现(称为红黑树算法),元素是按顺序进行排列,主要有add()、remove()以及contains()等方法,它们都是复杂度为O(log (n))的方法;它还提供了一些处理排序的set方法,如first(), last(), headSet(), tailSet()等。
add 方法实际调用TreeMap put 方法 
private static final Object PRESENT = new Object();
public boolean add(E e) {
    return m.put(e, PRESENT)==null;  //m 为TreeMap
}
 
demo:
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(1);
treeSet.add(1);
treeSet.add(3);
treeSet.add(2);
 
//treeSet.remove(3);
for (Integer var : treeSet) {
    System.out.println(var);
}
1
2
3
 
LinkedHashSet:
LinkedHashSet正好介于HashSet和TreeSet之间,它也是一个hash表,但它同时维护了一个双链表来记录插入的顺序,基本方法的复杂度为O(1)。元素顺序是可以保证的.
public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {}
 
demo:
LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(1);
linkedHashSet.add(1);
linkedHashSet.add(3);
linkedHashSet.add(2);
 
for (Integer var : linkedHashSet) {
    System.out.println(var);
}
1
3
2
posted @ 2019-07-25 11:18  小兵07  阅读(150)  评论(0编辑  收藏  举报