在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. SpringBoot简介

    Spring Boot,简单讲就是牺牲项目的自由度来减少配置的复杂度(“契约式编程”思想,SpringBoot自动配置方案的指导思想).约定一套规则,把这些框架都自动配置集成好,从而达到“开箱即用”. ...

  2. sql片段

    1):定义sql片段 <!-- 定义sql片段 --> <!-- id: sql片段的标识 经验:1:基于单表来定义sql片段,这样的话sql片段的可重用性才高 2:sql片段中不要 ...

  3. 51nod1238 最小公倍数之和 V3(莫比乌斯反演)

    题意 题目链接 Sol 不想打公式了,最后就是求一个 \(\sum_{i=1}^n ig(\frac{N}{i})\) \(g(i) = \sum_{i=1}^n \phi(i) i^2\) 拉个\( ...

  4. div中img依据不同分辨率居中显示,超出部分隐藏

    在做banner居中时 碰到的问题,知道可以用背景图实现居中显示,但是内心是想深究下的,故找到几种办法收集一下,后面两种真的是奇技淫巧 来着下面两处 https://www.zhihu.com/que ...

  5. xml可视化编辑器

    ——业内首创的在线可视化XML结构化数据编辑方法 Boxth Visual XML Web Editor (Boxth XWE) 是专为在线处理XML结构化数据而设计的在线(Web).可视化(WYSW ...

  6. Android为TV端助力 转载自jguangyou的博客,XML基本属性大全

    android:layout_width 指定组件布局宽度 android:layout_height 指定组件布局高度 android:alpha 设置组件透明度 android:backgroun ...

  7. Stable Fur Generation on Mesh

    After tested the Maya 2015 XGen Grooming, we dropped it, that's really slow and unstable, totally no ...

  8. 「Android」 Surface分析

    本篇针对Surface模块进行分析,从Java层的Activity创建开始,到ViewRoot.WindowsManagerService,再到JNI层和Native层. 首先推荐一个Android源 ...

  9. linux 下svn操作

    * 前言: linux下的svn相比于gitlab,配置要求第一点:gitlab需要4G的内存,如果使用swap+内存的替代方案,理论上是可行的,但是实际操作中各种坑:     所以,由于条件限制,使 ...

  10. VirtualBox网络连接方式

    VirtualBox图形界面下有四种网络接入方式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接 ...