在java中。大家差点儿是离不开对集合的使用的,像Map系列,List系列。Set系列。可是非常多人没有了解过或者研究过这些集合类究竟能够用在什么地方,而且有什么注意的地方。因此本文分Map系列和List系列以及Set系列来讲述集合背后的故事。

一,HashMap

  1. HashMap的初始化容量是16。加载因子是0.75

  2. HashMap的key和value都能够为null

  3. HashMap的最大容量为1<<30

  4. HashMap是线程不安全的,HashMap推断线程不安全的方式是通过两个模数即modCount和HashIterator内部类的exceptedModCount是否相等来推断是否是出于多线程读写状态。假设不相等,则抛出ConcurrentModificationException异常,当中modCount在1.7曾经的版本号都是用volatile修饰的,可是从1.7開始就把这个修饰符去掉了,由于modCount是在改动了HashMap的结构之后加1,即modCount++,而大家都知道,volatile在多线程环境下无法保证原子性,因此1.7去掉这个修饰符也降低了一些性能损耗,至于怎样确保并发无误。就能够用Collections.synchronizedMap和ConcurrentHashMap了。

二。Collections.synchronizedMap和ConcurrentHashMap线程安全的差别

大家都知道这两个都是确保使用Map时的线程安全方案。可是这两者又有什么差别。他们真的能够保证线程安全吗?

  1. Collections.synchronizedMap方法是集合类Collections中的一个静态类,这个SynchronizedMap实现了Map和serializable接口。它的每一个方法都是使用synchronized来达到同步的,可是查看源码之后你会发现。当你调用了entrySet()方法之后。再从这个entrySet()方法返回Iterator迭代器。然后使用迭代器在多线程来remove()时,也会出现并发问题,为什么呢。由于这个iterator是Set接口的迭代器,跟这个静态类是没有关系了。这样也将导致会出现并发问题而抛出同步异常

  2. ConcurrentHashMap实现了AbstractMap抽象类和ConcurrentMap接口,这个类的同步是由JVM的底层代码来负责同步处理的,前面说过modCount,在这个同步类中也有modCount,可是它在这个类的HashIterator中没实用到,而是使用Unsafe的锁管理机制来迭代数据的。因此保证了数据的线程安全

  3. 通过以上对二者的描写叙述。能够知道,假设在多线程换进下确保不使用迭代器的情况下。二者都是能够使用的。可是假设使用迭代器,则仅仅能选择ConcurrentHashMap类来实现,推荐在多线程条件下,都使用ConcurrentHashMap。这样避免造成以后的尴尬......

关于HashMap的一些深入探索与理解的更多相关文章

  1. 对hashmap,hashset,hashtable的理解

    1.首先先理一下java的集合关系,Collection和Map接口是所有集合接口的根结点,其他集合都直接或者间接的实现了他们中的一个:collection下有:list(元素可重复)和set(不可重 ...

  2. 对hashmap与hashcode()、equals()的理解

    1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容 2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会 ...

  3. HashMap与HashTable的区别和理解

    Hashmap的理解 1:HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.HashMap储存的是键值对,HashMap很快.此类不保 ...

  4. Java中HashMap和TreeMap的区别深入理解

    首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. Has ...

  5. 【Android开发艺术探索】理解Window和WindowManager

    个人博客: http://www.milovetingting.cn 理解Window和WindowManager Window表示一个窗口的概念,是一个抽象类,具体实现是PhoneWindow,可以 ...

  6. 理解HashMap的原理

    HashMap内部数据结构        HashMap内部采用数组和链表结合的方式来存取数据(见下图).这种方式有什么好处呢? 我们知道,数组操作对于检索是O(1)的,能够很快的根据数组的下标定位对 ...

  7. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  8. php内核探索 [转]

    PHP内核探索:从SAPI接口开始 PHP内核探索:一次请求的开始与结束 PHP内核探索:一次请求生命周期 PHP内核探索:单进程SAPI生命周期 PHP内核探索:多进程/线程的SAPI生命周期 PH ...

  9. PHP内核探索:哈希碰撞攻击是什么?

    最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...

随机推荐

  1. 月薪25K的90后程序员,他们都经历了什么?

    如果说薪资是检验一家公司对程序员认可的标准,那么年纪轻轻就能达到月薪 25K,一定程度上说明了公司对他创造的价值的认可. 深访10+ 名月薪25K的程序员,发现他们最常见的三种成长途径是…… 在公司发 ...

  2. HashMap深度解析

    最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片 ...

  3. LNMP 一键安装 yum install php-mcrypt libmcrypt libmcrypt-devel

    centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包 有两种方法解决,一种是使用第三方源,这样还可以使用yum来安装,简单方便,坏处是第三方源多少有中不可靠的感 ...

  4. CSS3 画基本图形,圆形、椭圆形、三角形等

    CSS3圆角#css3-circle{ width: 150px; height: 150px; border-radius: 50%; }CSS3 椭圆形css3 radius#css3-elips ...

  5. Eslint使用(webpack中使用)

    一.安装 npm i -D eslint npm i babel-eslint \ eslint-config-airbnb \ // Airbnb的编码规范是在业界非常流行的一套规范 eslint- ...

  6. #WEB安全基础:HTML/CSS | 0x0 我的第一个网页

    #WEB安全基础:HTML/CSS系列,本系列采用第二人称以免你不知道我在对着你说话,以朋友的视角和你交流 HTML的中文名叫做超文本标记语言,CSS叫做层叠样式表 用HTML设计你的第一个网页,你需 ...

  7. python3 os模块

    os模块就是对操作系统进行操作,这个模块提供了一种使用操作系统相关功能的可移植方式.1.系统信息 posix.uname_result(sysname='Linux', nodename='liang ...

  8. Angular的12个经典问题,看看你能答对几个?(文末附带Angular测试)

    Angular作为目前最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手,还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...

  9. iOS------教你如何APP怎么加急审核

    苹果的加急审核如何使用呢? 在iTunesconnect页面,点击右上角的“?”图标,在弹出菜单中选择“联系我们”, 联系我们 然后在Contact Us页面,选择“App Review” —> ...

  10. loadrunner 脚本优化-集合点设置

    脚本优化-集合点设置 by:授客 QQ:1033553122 添加集合点(Insert->Rendezvous) 当一个集合点被插入,VuGen往Vuser脚本中插入一个lr_rendezvou ...