这三者的关系面试最常被问到的,在这里说下自己的理解。
首先HashMap是线程不安全的,在处理高并发的情况下不适用,Hatabel和Concurrent作为线程安全的集合类,就派上用场了。那这两者是怎么实现线程安全,以及两者的区别在哪呢?
首先我么来看一下Hashtabel的源码:

public synchronized V put(K key, V value) {// Make sure the value is not null
if (value == null) {throw new NullPointerException();
}// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}
}addEntry(hash, key, value, index);
return null;
}
public synchronized V get(Object key) {Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {if ((e.hash == hash) && e.key.equals(key)) {return (V)e.value;}
}
return null;
}

通过synchronize锁来实现线程安全的,这样就不会出现两个线程同时对数据进行操作,降低了执行的效率。
而ConcurrentHashMap则使用CAS算法,在读不加锁,写操作给每个segment加锁,其他的segment还可以被其他的线程操作,提高了并发的执行效率。java1.7之前实现方法:
分段锁

将内部进行分段,即segment,每个segment下HashEntry数组,和HashMap类似,加锁的时候在segment,不影响其他的segment,让锁的粒度变小

补充
ConcurrentHashMap主要是一个大的HashEntry数组和多个segment组成,通过两次hash算法,把数据存到segment的链表中。
segment继承RetrantLock,在进行put操作时,进行tryLock()获取锁,如果获取成功就插入到位置,如果获取失败,自旋循环获取,超过指定次数挂起,等待唤醒

jdk1.8是利用CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构

补充
Synchronize和RetrantLock的区别:
1 早期的时候,Synchronize是基于JVM的,调用操作的接口时间消耗较长
2 RetrantLock则是程序员手写的,通过lock()和unlock()方法配合try/finally语句块来完成。可以设置过期时间,避免死锁,而且设置了中断机制
3 java1.8后,synchronize有了很大的优化,性能和RetrantLock差不多

java中的锁有哪些??
可参考https://www.cnblogs.com/hustzzl/p/9343797.html

HashMap,Hashtabel,ConcurrentHashMap的区别相关推荐

  1. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

    Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...

  2. HashMap与ConcurrentHashMap的区别

    从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...

  3. (二)Java中的HashMap与ConcurrentHashMap的区别

    HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了. ConcurrentHashMap具 ...

  4. 面试题:HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

    Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...

  5. Android-App-启动优化全记录,hashmap和concurrenthashmap的区别

    控制线程数量 – 线程池 检查线程间的锁 ,防止依赖等待 使用合理的启动架构 微信内部使用的 mmkernel 阿里 Alpha 系统调度优化 应用启动的时候,如果主线程的工作过多,也会造成主线程过于 ...

  6. HashMap HashTable和ConcurrentHashMap的区别

    HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronizatio ...

  7. Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的

    多选 Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的:答案在文末 A. Hashtable的K ...

  8. 3、HashMap、HashTable和ConcurrentHashMap的区别?

    HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTab ...

  9. HashMap、HashTable和ConcurrentHashMap的区别?

    HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTab ...

  10. HashMap、HashTable和ConcurrentHashMap的区别

    HahMap.HashTable和ConcurrentHashMap的区别: HashMap HashTable ConcurrentHashMap null键 允许 不允许 不允许 null值 允许 ...

最新文章

  1. 通信基站电池,再也不怕丢了
  2. C++ reinterpret_cast,const_cast等 显式类型转换总结
  3. Python3中的 Filter的改变
  4. 高维(多变量)优化问题的技术与瓶颈
  5. 品牌怎么做知乎营销?
  6. Ubuntu换源-阿里源
  7. tp房产源码tpfangchan-fangcms-tphouse火车头采集软件方法
  8. FL Studio混合器之效果器插槽部分讲解
  9. Xcode10适配之libstdc++.6.0.9.tdb
  10. 数学规划模型(一):数学规划模型的基本知识
  11. 记一次TX2安装向日葵
  12. 野狐网游分析手记(2016年3月28日更新)
  13. lol8.18服务器不稳定,lol8月18日更新BUG修复一览 8月18日更新修复了哪些BUG
  14. 上海抗疫|上海:公安机关将持续抓好各项疫情防控措施落实,努力保民生、解民忧
  15. FPGA verilog 基于SPI总线协议控制flash的项目升级
  16. 诛仙3网游:物品无法快速销毁怎么办?
  17. typedef 定义函数指针
  18. Reversible Attack相关论文阅读
  19. CVPR2022-利用3D合成数据进行人像眼镜和阴影去除
  20. 用python 合并 excel多行成一行

热门文章

  1. Mybatis源码概览(一)
  2. 配置eclipse插件
  3. this kernel requires an x86-64 CPU, but only detected an i686 CPU
  4. 获取图层字段的唯一值集合(ArcEngine)
  5. Button.Text属性换行问题(Button.Bounds自动换行)
  6. 1.GitLab 安装使用
  7. 27. netstat
  8. 30. SELinux
  9. 2. crontab 的使用
  10. 72. 文件上传(1)