Java 集合類——Collections(3)

Set接口

set接口的特色:bash

  • 不容許出現重複的元素
  • 集合中的元素位置無順序
  • 有且只有一個值爲null的元素

由於set是一個抽象的接口,因此不能直接實例化一個set對象。(Set s = new Set()是錯誤的)ui

Set接口的兩大實現:HashSet、TreeSetthis

經常使用方法:

  • add():向集合添加元素
  • clear():清除集合中全部元素
  • contains():判斷集合是否包括某一元素
  • isEmpty():判斷集合是否爲空
  • iterator():用於遍歷集合
  • remove():從集合中去掉特定的對象
  • size():返回集合的大小

HashSet

HashSet是基於HashMap來實現的,使用了HashMap的key來實現各類特性,而HashMap的value始終是PRESENT。spa

HashSet存儲元素的順序並非按照存入時的順序,是按照哈希值來存的,因此取數據也是按照哈希值取的。.net

構造方法code

//構造一個新的空Set,底層是HashMap
public HashSet() {
    map = new HashMap<>();
}

//構造一個包含指定collection中的全部元素的新Set
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

//構造一個新的空Set,其底層的HashMap實例具備指定的初始容量和默認的加載因子
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

//構造一個新的空Set,其底層的HashMap實例具備指定的初始容量和指定的加載因子
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}複製代碼

HashSet是如何判斷兩個元素重複:對象

經過hashCode()方法和equals方法來保證元素的惟一性,add方法返回boolean類型。blog

判斷兩個元素是否相同,先判斷元素的hashCode值是否一致。若是一致,就會調用equals方法。若是equals返回true,HashSet就視爲同一元素;返回false,則不是同一元素。排序

HashSet和ArrayList集合都有判斷是否有相同元素的方法。接口

//HashSet,底層用hashCode和equals方法判斷
public boolean contains(Object o) {
    return map.containsKey(o);
}

//ArrayList的contains方法,底層用equals方法判斷
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}
複製代碼

TreeSet

TreeSet是一個有序集合,能夠按任何順序將元素插入該集合,當對該集合進行迭代時,元素按照升序排序。

TreeSet的底層使用的是TreeMap,TreeMap的底層實現是紅黑樹。

構造方法:

public TreeSet() {
    this(new TreeMap<E,Object>());
}
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}
public TreeSet(SortedSet<E> s) {
    this(s.comparator());
    addAll(s);
}複製代碼


參考資料:

Java Set集合的詳解

相關文章
相關標籤/搜索