HashSet 如何體現出無序性?


爲什麼sh說HashSet是無序的?首先我們看源碼解析。

一、創建hashset實例化對象

Set<String> set = new HashSet<String>();
set.add("hello");
set.add("hello");//重複元素
set.add("java");
set.add("world");
System.out.println(set);//[java, world, hello]

二、查看源碼

1、源碼類頭構造

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

2、HashSet集合的主要成員變量

    private transient HashMap<E,Object> map;
 
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
 
    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

3、HashSet集合添加數據

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

三、查看HashMap的put添加數據方式

    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

四、總結分析

通過之前分析的hashmap數據增加的源碼,可以發現:

1、HashSet集合操作,是將數據值存入至HashMap的key中;

2、HashMap在保存數據時,順序是通過計算key的hash值和當前數組長度的 & 運算,計算保存數據的下標位置。所以說set是無序的。

3、由於每次保存數據,存入的是一個共同的值:

private static final Object PRESENT = new Object();

當存在key的hash與數組大小 & 計算到的值存在數組中時,則會進行新的值的覆蓋,所以說set是不重複的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章