Java中HashSet的學習

HashSet是非同步的,允許使用null元素。如果多個線程同時訪問一個Hashset,而其中至少一個線程修改了該set,那麼它必須保持外部同步。這通常是通過對自然封裝該set的對象執行同步操作來完成的。如果不存在這樣的對象,則應該使用 Collections.synchronizedSet方法來“包裝”set。最好在創建時完成這一操作,以防止對該set進行意外的不同步訪問:

Set s = Collections.synchronizedSet(new HashSet(...));


在某些時候HashSet<Integer>的輸出會恰好是有序的,這是因爲插入HashSet的是Integer,其hashCode()實現就返回int值本身。所以在對象hashCode這一步引入了巧合的“按大小排序”。然後HashMap.hash(Object)獲取了對象的hashCode()之後會嘗試進一步混淆。所以在HashSet中,不保證有序與保證無序是不等價的。


// 代碼實現
import java.util.HashSet;
import java.util.Iterator;

public class TestHashSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HashSet<Integer> set = new HashSet<>();
		set.add(30000000);
		set.add(50000000);
		set.add(40000000);
		set.add(10000000);
		set.add(20000000);
		// Java的HashSet是不保證有序,而與保證無序不等價
		Iterator it = set.iterator();
		while(it.hasNext()) {
			System.out.print((Integer)it.next() + (it.hasNext() ? ", ": ""));
		}
		System.out.println();
		for(Integer e : set) {
			System.out.print(e + ", ");
		}
		System.out.println();
		System.out.println("contains 10000000: " + set.contains(10000000));
	}


參考資料:

Java 集合系列16之 HashSet詳細介紹(源碼解析)和使用示例

Java遍歷HashSet爲什麼輸出是有序的? -知乎


繼續加油~

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