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

相关文章
相关标签/搜索