增加红黑树这个存储结构

在Java8中,为什么要增加红黑树这种数据结构来进行存储,而不是全部使用链表来进行存储呢? 1.因为攻击者可以构造大量具有相同hashCode的内容,使其全部放在同一个列表中,这样,在查找的时候,所花费的时间会很长。这个时候,如果采用红黑树这个结构来进行存储,那么其查找的效率会高很多。 2.hashCode()函数的计算有时候并不合理,例如重写hashCode函数的时候。如果都映射到同一个位置,那么查找的时间也会很长。

mappingCount()

在ConcurrentHashMap中如果存储大量的元素,那么使用size()方法获取的结果可能不正确,因为其是用int类型作为返回值的。

如果想要获取到正确的结果,那么可以使用hashMap.mappingCount();其返回值为long类型。

更新指定键中的值

ConcurrentHashMap是一个安全的数据结构(get()、put()操作不会破坏数据结构),但是它的并不保证操作值的安全。例如设置对应键的值,这个就不是线程安全的。

如何才能安全地更新值呢?

使用replace()方法

值使用的是LongAdder,它可以保证原子操作

Java8新增的方法来实现线程安全地对键进行操作

 

ConcurrentHashMap在Java8中的变化的更多相关文章

  1. Java7与Java8中的HashMap和ConcurrentHashMap知识点总结

    JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这 ...

  2. Java8 中 ConcurrentHashMap工作原理的要点分析

    简介: 本文主要介绍Java8中的并发容器ConcurrentHashMap的工作原理,和其它文章不同的是,本文重点分析了不同线程的各类并发操作如get,put,remove之间是如何同步的,以及这些 ...

  3. Java7 和 Java8 中的 ConcurrentHashMap 原理解析

    Java7 中 ConcurrentHashMap ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些. 整个 ConcurrentHash ...

  4. java7,java8 中HashMap和ConcurrentHashMap简介

    一:Java7 中的HashMap 结构: HashMap 里面是一个数组,然后数组中每个元素是一个单向链表.链表中每个元素称为一个Entry 实例,Entry 包含四个属性:key, value, ...

  5. java8 中的时间和数据的变化

    java8除了lambda表达式之外还对时间和数组这两块常用API做想应调整, Stream 有几个常用函数: store 排序 (a,b)-> a.compareTo(b)  排出来的结果是正 ...

  6. java8中ConcurrentHashMap

    HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上. Fast-fail: fail-fast 机制是java集合(Collection)中的一种错误机制. ...

  7. Java8中的HashMap分析

    本篇文章是网上多篇文章的精华的总结,结合自己看源代码的一些感悟,其中线程安全性和性能测试部分并未做实践测试,直接是“拿来”网上的博客的. 哈希表概述 哈希表本质上一个数组,数组中每一个元素称为一个箱子 ...

  8. java8中map的meger方法的使用

    java8中map有一个merge方法使用示例: /** * 打印出包含号码集的label的集合 * * @param args */ public static void main(String[] ...

  9. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  10. Java8函数之旅 (二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

随机推荐

  1. win10上打包的qt程序放到win7上打不开的解决方法

    在win 10 上编写并打包发布了qt5.12.3 msvc2017 32bit的qt程序,在其他win10 电脑上都能正常运行,但是放到win7电脑上,运行exe时依次出现缺少"msvcp ...

  2. HIVE- concat方法

    (1)concat_ws() select user ,concat_ws(';' , collect_set(cast(amt as string))) as amt from table grou ...

  3. 正整数n型方阵

    正整数n型方阵(不用数组完成) 一般呢这种n型方阵很多人都是用数组完成,今天呢小编就用简单的循环控制结构来完成,不需用到数组.题目:从键盘输入一个正整数n,根据n形成一个方阵.方阵最外层是第一层,每层 ...

  4. C 标准 C89/C90/C99/C11/C17

    C89/C90 PDF:https://www.yodaiken.com/wp-content/uploads/2021/05/ansi-iso-9899-1990-1.pdf C99 PDF:htt ...

  5. C# List提取类中某列保存成新list

    例如,将oldList中的ID列提取出来存放到newList中: List<ushort> newList = new List<ushort>(oldList.Select( ...

  6. 通过Container制作Image

    1.拉取tomcat镜像 docker pull tomcat docker images 2.根据tomcat镜像创建一个tomcat container docker run -d -it --n ...

  7. -behaviour()的使用,他具体有什么作用

    Eralng 编程中的OTP OTP里面创建进程时 常用有四大behaviour • supervisor • gen_server • gen_fsm • gen_event 在erlang的编译器 ...

  8. Jenkins自动化部署(linux环境)---安装篇

    1.安装java yum install java 2.安装Jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.or ...

  9. drush .. drupal console

    "You can run both." They compliment each other, yet the final decision is yours. Especiall ...

  10. Fortran 笔记之 继承和聚合

    继承(类扩展)和聚合 参考自Introduction to Modern Fortran for the Earth System Sciences 我们在3.3部分的开头提到过,OOP范式通常会导致 ...