WeakHashMap與HashMap WeakHashMap中的key採用的是“弱引用”的方式,只要WeakHashMap中的key不再被外部引用,所對應的鍵值對就可以被垃圾回收器回收。 HashMap中的key採用的是“強引用”的方式,當key不再被外部引用時,只有當這個key從HashMap中 ...
WeakHashMap與HashMap
WeakHashMap中的key採用的是“弱引用”的方式,只要WeakHashMap中的key不再被外部引用,所對應的鍵值對就可以被垃圾回收器回收。
HashMap中的key採用的是“強引用”的方式,當key不再被外部引用時,只有當這個key從HashMap中刪除後,才可以被垃圾回收器回收。
HashMap和TreeMap區別
1、實現方式的區別
HashMap:基於哈希表實現。TreeMap:基於紅黑樹實現。
2、TreeMap能夠把它保存的記錄根據鍵排序。
3、HashMap:適用於Map中插入、刪除和查找元素。
TreeMap:適用於按自然順序或自定義順序遍歷鍵(key)。
HashMap通常比TreeMap快一點。
HashSet的實現原理
對於HashSet而言,它是基於HashMap實現的,HashSet底層使用HashMap來保存所有元素,因此HashSet的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成。HashSet中的元素都存放在HashMap的key上面,而value中的值都是統一的一個private static final Object PRESENT = new Object();
//底層使用HashMap來保存HashSet中所有元素
private transient HashMap<E,Object>map;
//定義了一個虛擬的Object對象作為HashMap的value,將此對象定義為static final。
private static final Object PRESENT = new Object();
//預設的無參構造器,構造一個空的HashSet
//實際底層會初始化一個空的HashMap,並使用預設初始化容量為16和載入因數0.75
public HashSet(){
map = new HashMap<E,Object>();
}
public boolean add(E e){
return map.put(e, PRESENT)==null;
}
講一下集合中的fail-fast機制
例如:假設存在兩個線程(線程1、線程2),線程1通過Iterator在遍歷集合A中的元素,在某個時候線程2修改了集合A的結構(是結構上面的修改,而不是簡單的修改集合元素的內容),那麼這個時候程式就會拋出ConcurrentModificationException異常,從而產生fail-fast機制。
產生原因:
當調用容器的iterator()方法返回Iterator對象時,把容器中包含對象的個數賦值給了一個變數expectedModCount,在調用next()方法時,會比較expectedModCount與容器中實際對象的個數是否相等,若二者不相等,則會拋出ConcurrentModificationException異常。
如果在遍歷集合的同時,需要刪除元素的話,可以用iterator裡面的remove()方法刪除元素。