码迷,mamicode.com
首页 > 其他好文 > 详细

HashTable

时间:2020-01-15 09:17:45      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:dict   数组   arraylist   java   targe   dma   没有   ref   计算   

1、HashMap在多线程出现的问题:hashmMap在单线程下是没有问题的,正常hashMap初始化容量是16,当当前容量用尽的时候,hashMap就会发生扩容的现象,当数组扩容后,就会发生rehash,也就是重新计算所有元素的hash值,进行重新分配。而在rehash的时候,在多线程下就容易出现一个问题,有可能两个线程同时rehash,这时候就容易出现链表闭链的情况,当我们去get数据的时候,容易发生死循环。因此HashMap是线程不安全的。

2、HashTable:为了解决 HashMap 闭链的情况,就要给 HashMap 加锁,因此 HashTable 是线程安全的。hashTable相对于HashMap ,就是在所有的操作上都加上锁,使用synchronized关键字在put 、get、remove方法上修饰。 

 

hashmap和hashtable的区别:

  HashTable因为加上了锁,因此效率较低,使用concurrentHashMap在多线程下效率很高。

(1)HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
(2)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
(3)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
(4)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
(5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(如果是ArrayList:List lst = Collections.synchronizedList(new ArrayList());如果是HashMap:Map map = Collections.synchronizedMap(new HashMap());)。


Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

 

 

 

HashTable底层实现原理:http://www.imooc.com/article/details/id/23015

HashTable

标签:dict   数组   arraylist   java   targe   dma   没有   ref   计算   

原文地址:https://www.cnblogs.com/guoyu1/p/12194946.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!