在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. 程序猿制造Bug的根本原因竟然是....

    传说中: 「杀一个程序猿不需要用枪,改三次需求就可以了.」 而且, 「这竟然也是程序猿制造Bug的根本原因....」 ↓↓↓↓↓↓↓ #/原始需求/#   你去饭店,坐下来. “服务员,给我来份宫保鸡 ...

  2. Java多线程之内存可见性

    阅读本文约“3分钟” 共享变量在线程间的可见性 synchronized实现可见性 volatile实现可见性 —指令重排序 —as-if-serial语义 —volatile使用注意事项 synch ...

  3. .NET 发送电子邮件

    static void Main(string[] args) { ///先引入 using System.Net.Mail; ///发送邮件 using (MailMessage mailMessa ...

  4. 深入理解SpringCloud与微服务构建

    旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81742534 目录 一.SpringClou ...

  5. Spring Cloud 研发框架demo

    第一步:准备工作 1.下载并集成公司自定义maven maven包见QQ群文件 2.克隆Git源码到本地eclipse: xx 3.构建项目 一键初始化parent:run as maven inst ...

  6. MVC模式-----struts2框架

    MVC模式-----struts2框架 一.struts MVC模式 1.概述 MVC是模型(model)---视图model(view)---控制器(control)的缩写,是一种用于将逻辑.数据和 ...

  7. 真实世界的脉络].(英)戴维.多伊奇.pdf

    [真实世界的脉络].(英)戴维.多伊奇.pdf 宇宙.时间.生命.等等,如果用量子物理学.计算机科学.进化论.认识论将这些最基本而又复杂的问题纠缠在一起时,那将会是一幅什么样的图景呢?也许,我们穷尽一 ...

  8. js-clickNumCount.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. es6 语法 (数值扩展)

    { //二进制数值都是0b开头,八进制0o console.log(0b111110111) console.log(0o767); } { console.log('15',Number.isFin ...

  10. vue.js插入dom节点的方式

    html代码: <div id="app"></div> js代码: var MyComponent = Vue.extend({ template: '& ...