hashtable和hashmap

1.hashtable和hashmap算法

  [1]這兩個結構都採用數組+鏈表實現,稱做hashmap是由於它的每個元素是一個key-value對。數組

  [2]hashtable是線程安全的,它的每一個方法中都加入了Synchronize方法,意思是多線程時能夠直接調用提供的方法,而不用在外部進行加鎖同步。安全

      hashmap不是線程安全的,所以多線程時必須在外部加鎖進行同步。多線程

  [3]hashtable不支持null key和null value。線程

      hashmap支持null key和null value。null key只能有一個,null value能夠做爲正常的value。當get()方法返回null時,可能該key對應的value就是null,所以不能用get()來判斷是否存在某個key,而應該用containsKey()啦判斷。設計

  [4]hashtable默認的初始大小爲11,以後每次擴充,容量變爲原來的2n+1。get

      hashmap默認的初始化大小爲16。以後每次擴充,容量變爲原來的2倍。同步

  [5]建立時,若是給定了容量初始值,那麼Hashtable會直接使用你給定的大小,而HashMap會將其擴充爲2的冪次方大小。也就是說Hashtable會盡可能使用素數、奇數。而HashMap則老是使用2的冪做爲哈希表的大小。之因此會有這樣的不一樣,是由於Hashtable和HashMap設計時的側重點不一樣。Hashtable的側重點是哈希的結果更加均勻,使得哈希衝突減小。當哈希表的大小爲素數時,簡單的取模哈希的結果會更加均勻。而HashMap則更加關注hash的計算效率問題。在取模計算時,若是模數是2的冪,那麼咱們能夠直接使用位運算來獲得結果,效率要大大高於作除法。HashMap爲了加快hash的速度,將哈希表的大小固定爲了2的冪。固然這引入了哈希分佈不均勻的問題,因此HashMap爲解決這問題,又對hash算法作了一些改動。這從而致使了Hashtable和HashMap的計算hash值的方法不一樣。hash

相關文章
相關標籤/搜索