1. 程式人生 > >java集合(5):HashSet原始碼分析

java集合(5):HashSet原始碼分析

前言

  • HashSet實現 Set 介面,由雜湊表(實際上是一個 HashMap 例項)支援。它不保證 set的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。Set集合取出元素的方式只有一個,那就是迭代器。

  • Set介面中的方法與Collection介面中的方法相同。

  • HashSet底層依賴於HashMap,關於HashMap原始碼詳解見:HashMap原始碼詳解

正文

HashSet的原始碼分析

1,類名及類成員變數

public class HashSet<E> extends AbstractSet<E>
                        implements
Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L; // 底層使用HashMap來組織元素 private transient HashMap<E,Object> map; // PRESENT作為靜態常量,用來填充HashMap的value private static final Object PRESENT = new Object(); }

2,HashSet類構造方法

    // 1,預設無參構造方法,構造一個空的HashSet,初始容量16,載入因子0.75
public HashSet() { map = new HashMap<>(); } // 2,構造指定容量的空HashSet public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } // 3,構造指定容量和載入因子的空HashSet public HashSet(int initialCapacity, float loadFactor) { map = new
HashMap<>(initialCapacity, loadFactor); } // 4,內部構造方法,不對外開放。對LinkedHashSet的支援 HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); } // 5,構造一個包含指定集合的HashSet public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }

3,HashSet類常用方法

    // add()呼叫map的put()方法,value用PRESENT常量填充
    public boolean add(E e) {
        return map.put(e, PRESENT)==null; 
    }

    // size()呼叫map的size()方法
    public int size() {
        return map.size();
    }

    // iterator()呼叫map的迭代器方法
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

總結

HashSet完全依賴於HashMap,所以要好好理解HashMap的實現原理。