在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. [android] 开启新的activity获取他的返回值

    应用场景:打开一个新的activity,在这个activity上获取数据,返回给打开它的界面 短信发送时,可以直接选择系统联系人 界面布局是一个线性布局,里面右侧选择联系人在EditText的右上,因 ...

  2. Java_文件夹拷贝

    一.思路 * 文件夹的拷贝 1.递归查找子孙级文件 2.文件复制 文件夹创建 二.代码 package com.ahd.File; import java.io.File; import java.i ...

  3. 6.2 小表驱动大表(exists的应用)

    1. 优化原则:小表驱动大表,即小数据集驱动大数据集. select * from A where id in (select id from B) 等价于: for select id from B ...

  4. 【Java每日一题】20170222

    20170221问题解析请点击今日问题下方的“[Java每日一题]20170222”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...

  5. 不容易系列之一(hdu1465)错排+递推

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. JDK和Tomcat安装

    JDK安装: 1,选择安装位置,其余默认安装,安装两次,一个是JDK,一个是JRE,安装在两个文件夹中. 2,配置环境变量: 1,新建一个变量,变量名:JAVA_HOME,变量值:C:\Program ...

  7. jQuery 练习:tab 切换

    实现内容随菜单切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. K8S 基本操作

    上一篇文章中,我们一创建了一个简单的 K8S 集群,https://www.cnblogs.com/klvchen/p/9553499.html 这里我们开始使用 kubectl 命令来创建应用,下面 ...

  9. tsung HTTP协议统计报告分析

    tsung HTTP协议统计报告分析 by:授客 QQ:1033553122 1.   Main Static l  higest 10sec mean: 基于每10s的统计,最大耗时 l  lowe ...

  10. Python绘图工具Plotly的简单使用

    1.Plotly被称为史上最好的绘图工具之一,为了更好的展示金融数据的复杂性. Plotly的官方网站为:https://plot.ly/ python量化的关键是金融数据可视化,无论是传统的K线图, ...