java中hashmap的實現原理以及hashmap的正確使用

http://www.cnblogs.com/skywang12345/p/3323085.html

上面網址是博客園一位博主總結的關於java結合類的深入理解,個人認爲總結的很深入全面,而且容易理解。讀者可以參考裏面的文章。


關於正確的使用hashmap:

1:不要在併發場景中使用HashMap
           HashMap是線程不安全的,如果被多個線程共享的操作,將會引發不可預知的問題,據sun的說法,在擴容時,會引起鏈表的閉環,在get元素時,就會無限循環,後果是cpu100%。
看看get方法的紅色部分

Java代碼  收藏代碼
  1. public V get(Object key) {  
  2.     if (key == null)  
  3.         return getForNullKey();  
  4.         int hash = hash(key.hashCode());  
  5.         for (Entry<K,V> e = table[indexFor(hash, table.length)];  
  6.              e != null;  
  7.              e = e.next) {  
  8.             Object k;  
  9.             if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
  10.                 return e.value;  
  11.         }  
  12.         return null;  
  13.     }  
 


2:如果數據大小是固定的,那麼最好給HashMap設定一個合理的容量值
        根據上面的分析,HashMap的初始默認容量是16,默認加載因子是0.75,也就是說,如果採用HashMap的默認構造函數,當增加數據時,數據實際容量超過10*0.75=12時,HashMap就擴容,擴容帶來一系列的運算,新建一個是原來容量2倍的數組,對原有元素全部重新哈希,如果你的數據有幾千幾萬個,而用默認的HashMap構造函數,那結果是非常悲劇的,因爲HashMap不斷擴容,不斷哈希,在使用HashMap的場景裏,不會是多個線程共享一個HashMap,除非對HashMap包裝並同步,由此產生的內存開銷和cpu開銷在某些情況下可能是致命的。


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