http://www.cnblogs.com/skywang12345/p/3323085.html
上面網址是博客園一位博主總結的關於java結合類的深入理解,個人認爲總結的很深入全面,而且容易理解。讀者可以參考裏面的文章。
關於正確的使用hashmap:
1:不要在併發場景中使用HashMap
HashMap是線程不安全的,如果被多個線程共享的操作,將會引發不可預知的問題,據sun的說法,在擴容時,會引起鏈表的閉環,在get元素時,就會無限循環,後果是cpu100%。
看看get方法的紅色部分
- public V get(Object key) {
- if (key == null)
- return getForNullKey();
- int hash = hash(key.hashCode());
- for (Entry<K,V> e = table[indexFor(hash, table.length)];
- e != null;
- e = e.next) {
- Object k;
- if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
- return e.value;
- }
- return null;
- }
2:如果數據大小是固定的,那麼最好給HashMap設定一個合理的容量值
根據上面的分析,HashMap的初始默認容量是16,默認加載因子是0.75,也就是說,如果採用HashMap的默認構造函數,當增加數據時,數據實際容量超過10*0.75=12時,HashMap就擴容,擴容帶來一系列的運算,新建一個是原來容量2倍的數組,對原有元素全部重新哈希,如果你的數據有幾千幾萬個,而用默認的HashMap構造函數,那結果是非常悲劇的,因爲HashMap不斷擴容,不斷哈希,在使用HashMap的場景裏,不會是多個線程共享一個HashMap,除非對HashMap包裝並同步,由此產生的內存開銷和cpu開銷在某些情況下可能是致命的。