爲什麼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是不重複的。