文章目录

  • 三者的简介
  • HashMap
  • HashTable
  • ConcurrentHashMap

三者的简介

面试中经常被问到的一个问题,HashMap和ConcurrentHashMap区别是什么,今天把这个问题好好整理一下。
HashMap是线程不安全的,当出现多线程操作时,会出现安全隐患,我们可能会想到HashTable,是的,这个是线程安全的,但是HashTable用的是方法锁,把整个put方法都上锁了,这就导致了效率很低,如果把put方法比作是一个有很多房间的院子,那么HathTable的锁就相当于是把院子的大门锁上了。而ConcurrentHashMap是用的块锁,相当于是把院子里的有安全隐患的房间锁上了,这样一来,就不会让去其他房间办事的人等待了。

HashMap

HashMap是线程不安全的,在原码中对put方法没有做锁的处理,当放生多线程时,会有线程安全问题,下面通过一个简单的例子进行演示,创建三个线程,并且启动,在run方法里通过for循环给map存100个值,然后输出map的大小按正常来说,该map的大小应该是100,而这里输出了176。

class Demo implements Runnable{static Map<String,String> map = new HashMap<>();@Overridepublic void run() {for (int i = 0; i < 100; i ++) {map.put(i + "","value");}}public static void main(String[] args) {new Thread(new Demo()).start();new Thread(new Demo()).start();new Thread(new Demo()).start();// 获取当前线程Thread currentThread = Thread.currentThread();// 当前线程睡眠2秒,让上面的三个线程先执行try {currentThread.sleep(2000);} catch (Exception e) {e.getMessage();}// 上面的线程执行完毕后输出map的大小System.out.println(map.size());}
}

HashTable

HashTable用到了锁,而且是直接给put方法加的锁,线程肯定是安全的了,这里我们在测试线程安全的同时,看一下执行时间,这里通过put10000个数据进行测试,通过结果可以看到,map的大小确实是10000,而时间用了16ms左右。

class Demo implements Runnable{static Map<String,String> map = new Hashtable<>();@Overridepublic void run() {long startTime = System.currentTimeMillis(); //获取开始时间for (int i = 0; i < 10000; i ++) {map.put(i + "","value");}long endTime = System.currentTimeMillis(); //获取结束时间System.out.println((endTime - startTime) + "ms");}public static void main(String[] args) {new Thread(new Demo()).start();new Thread(new Demo()).start();new Thread(new Demo()).start();// 获取当前线程Thread currentThread = Thread.currentThread();// 当前线程睡眠2秒,让上面的三个线程先执行try {currentThread.sleep(2000);} catch (Exception e) {e.getMessage();}// 上面的线程执行完毕后输出map的大小System.out.println(map.size());}
}

ConcurrentHashMap

ConcurrentHashMap用的是块锁,哪块不安全就锁哪块,不能不锁,不能全锁,那我就块锁!看看这个块锁相对于方法锁是快了,还是慢了。

class Demo implements Runnable{static Map<String,String> map = new ConcurrentHashMap<>();@Overridepublic void run() {long startTime = System.currentTimeMillis(); //获取开始时间for (int i = 0; i < 10000; i ++) {map.put(i + "","value");}long endTime = System.currentTimeMillis(); //获取结束时间System.out.println((endTime - startTime) + "ms");}public static void main(String[] args) {new Thread(new Demo()).start();new Thread(new Demo()).start();new Thread(new Demo()).start();// 获取当前线程Thread currentThread = Thread.currentThread();// 当前线程睡眠2秒,让上面的三个线程先执行try {currentThread.sleep(2000);} catch (Exception e) {e.getMessage();}// 上面的线程执行完毕后输出map的大小System.out.println(map.size());}
}


从结果中看到,从之前的20ms和22ms提高到了现在的17ms和18ms

你需要了解的HashMap、HashTable和ConcurrentHashMap的区别相关推荐

  1. HashMap HashTable和ConcurrentHashMap的区别

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

  2. Java Main Differences between HashMap HashTable and ConcurrentHashMap

    转自这篇帖子:http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以 ...

  3. HashMap、HashTable和ConcurrentHashMap的区别

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

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

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

  5. HashMap、HashTable和ConcurrentHashMap的区别?

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

  6. HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类

    HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...

  7. 面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别

    本文转载自 夏雪冬日:https://www.cnblogs.com/heyonggang/p/9112731.html 在实际面试过程中出现集合 Map 的概率接近 100%,可见不背上个 Map ...

  8. HashMap,HashTable,ConcurrentHashMap面试总结!!!

    原文:https://www.cnblogs.com/hexinwei1/p/10000779.html 一.小总结 1.HashMap .HashTable. ConcurrentHashMap H ...

  9. 一文读懂JDK7,8,JD9的HashMap,HashTable,ConcurrentHashMap及他们的区别

    内容和标题一样长哦,人家写了好久的.如无特别指明,内容对应的源码是jdk1.7(后面会和1.8对比) 1:hashmap简介(如下,数组-链表形式) HashMap的存储结构 图中,紫色部分即代表哈希 ...

最新文章

  1. 交换机的特点及工作原理
  2. 人工通道会取消吗_二七政策将用于ETC?高速或将取消人工收费通道
  3. 课下作业:评估输入法(搜狗)
  4. SWT、JavaFx十种页面布局快速理解
  5. 网站云服务器资料本地备份,云服务器上备份本地数据
  6. 3G手机Android应用开发视频教程_黎活明老师的视频(第五天课程)总共有八天课程...
  7. JavaScript算法 之 选择排序
  8. 【风电功率预测】基于matlab EMD优化LSTM风电功率预测【含Matlab源码 1402期】
  9. 数字基带通信系统的实现流程
  10. 高淇python400集课堂笔记_魔力耳朵重磅推出1对1课堂“全班型”满足更多中国家庭教育需求...
  11. Android控件详解之网格控件
  12. Linux压缩命令gzip, bzip2和tar
  13. 层次短语模型学习笔记
  14. 财务数据填报怎样做?用这个报表工具轻松搞定!_光点科技
  15. 腾讯实习生面试2016两道面试题目?(知乎)
  16. 车站检查危险品 JAVA,第八周Java实验报告六
  17. Python时间差中seconds和total_seconds的区别
  18. 从零学Linux第一章——操作系统演变及历史介绍
  19. Siri说过的冷笑话
  20. 用Python删除电脑中的重复文件!竟然这么简单!

热门文章

  1. 如何让div在整个页面中居中?
  2. 内网信息安全厂商对客户的误导
  3. [递归][重心] Luogu P4886 快递员
  4. [APIO2013]机器人(斯坦纳树)
  5. Stack应用 - 数学表达式(Balanced parentheses)括号完全匹配
  6. 【学术篇】2.28测试T2 线段 拓扑排序
  7. laravel sql多个orWhere条件时数据查询错误
  8. 第二次冲刺-站立会议06
  9. Link节点类的改进——通过构建freelist自行管理内存
  10. SPS中计算值公式函数简介