标签: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
标签:dict 数组 arraylist java targe dma 没有 ref 计算
原文地址:https://www.cnblogs.com/guoyu1/p/12194946.html