1. 程式人生 > >HashMap工作原理以及與HashTable的區別--面試題

HashMap工作原理以及與HashTable的區別--面試題

  1. 每當往hashmap裡面存放key-value對的時候,都會為它們例項化一個Entry物件,這個Entry物件就會儲存在前面提到的Entry陣列table中。現在你一定很想知道,上面建立的Entry物件將會存放在具體哪個位置(在table中的精確位置)。答案就是,根據key的hashcode()方法計算出來的hash值(來決定)。hash值用來計算key在Entry陣列的索引。

要牢記以下關鍵點:

  • HashMap有一個叫做Entry的內部類,它用來儲存key-value對。
  • 上面的Entry物件是儲存在一個叫做table的Entry陣列中。
  • table的索引在邏輯上叫做“桶”(bucket),它儲存了連結串列
    的第一個元素。
  • key的hashcode()方法用來找到Entry物件所在的桶。
  • 如果兩個key有相同的hash值(即衝突),他們會被放在table陣列的同一個桶裡面(以連結串列方式儲存)。
  • key的equals()方法用來確保key的唯一性。
  • value物件的equals()和hashcode()方法根本一點用也沒有。
quote from:http://www.importnew.com/10620.html Hashtable和HashMap都實現Map介面,有幾個主要的不同:執行緒安全以及速度。僅在你需要完全的執行緒安全的時候使用Hashtable,而如果你使用Java5或以上的話,請使用ConcurrentHashMap
吧。
HashMap是非synchronized,即非執行緒安全,但在單執行緒下,速度快。

我們能否讓HashMap同步?

HashMap可以通過下面的語句進行同步:
Map m = Collections.synchronizeMap(hashMap);

quote from:http://www.importnew.com/7010.html

ConurrentHashMap和Hashtable的區別

為什麼我們需要ConcurrentHashMapCopyOnWriteArrayList

同步的集合類(Hashtable和Vector),同步的封裝類(使用Collections.synchronizedMap()方法和Collections.synchronizedList()方法返回的物件)可以創建出執行緒安全的Map和List。但是有些因素使得它們不適合高併發的系統。它們僅有單個鎖,對整個集合加鎖,以及為了防止ConcurrentModificationException異常經常要在迭代的時候要將集合鎖定一段時間,這些特性對可擴充套件性來說都是障礙。

ConcurrentHashMap和CopyOnWriteArrayList保留了執行緒安全的同時,也提供了更高的併發性。ConcurrentHashMap和CopyOnWriteArrayList並不是處處都需要用,大部分時候你只需要用到HashMap和ArrayList,它們用於應對一些普通的情況。

簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。