Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ConcurrentMap的Method

ConcurrentMap的Method

作者头像
WindCoder
发布于 2020-01-21 08:39:28
发布于 2020-01-21 08:39:28
84500
代码可运行
举报
文章被收录于专栏:WindCoderWindCoder
运行总次数:0
代码可运行

暂且仅记录方法:computecomputeIfAbsentcomputeIfPresentputIfAbsent

基础

Method

形式

描述

实例

功能特性

compute

default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

尝试计算指定key及其当前映射值的映射(如果没有当前映射,则为null)。

map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))

新增/替换更新

computeIfAbsent

default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

如果指定的key尚未与值相关联(或映射到null),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非为null。

map.computeIfAbsent(key, k -> new Value(f(k)));

新增

computeIfPresent

default V computeIfPresent(K key,BiFunction<? super K,? super V,? extends V> remappingFunction)

如果指定key的值存在且非空,则尝试计算给定key及其当前映射值V的新映射。

map.computeIfPresent(1, (key, value) -> (key + 1) + value);

替换更新

putIfAbsent

V putIfAbsent(K key,V value)

如果指定的key相关联value不存在,则与给定值相关联,并返回新值,反之返回key关联的旧值。

map.putIfAbsent(3, "d");

新增

默认实现的类似转换

以下仅是方法的类似转换,区别是方法本身是原子实现,属于线程安全的,转换得到的例子则无法保证线程安全,存在并发问题。

compute

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 V oldValue = map.get(key);
 V newValue = remappingFunction.apply(key, oldValue);
 if (oldValue != null ) {
    if (newValue != null)
       map.replace(key, oldValue, newValue);
    else
       map.remove(key, oldValue);
 } else {
    if (newValue != null)
       map.putIfAbsent(key, newValue);
    else
       return null;
 }

computeIfAbsent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if (map.get(key) == null) {
     V newValue = mappingFunction.apply(key);
     if (newValue != null)
         return map.putIfAbsent(key, newValue);
 }

computeIfPresent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if (map.get(key) != null) {
     V oldValue = map.get(key);
     V newValue = remappingFunction.apply(key, oldValue);
     if (newValue != null)
         map.replace(key, oldValue, newValue);
     else
         map.remove(key, oldValue);
 }

putIfAbsent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if (!map.containsKey(key))
   return map.put(key, value);
 else
   return map.get(key);

参考

Interface ConcurrentMap<K,V>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊Elasticsearch的ConcurrentMapLong
elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurrent/ConcurrentMapLong.java
code4it
2019/06/03
3440
聊聊Elasticsearch的ConcurrentMapLong
Map 只会 put、get?快来学这几个“新”方法
Map是我们日常编程中十分常用的数据接口,的在JDK8中,Map引入了几个新方法,可以简化我们对Map中数据的操作。
程序员皮皮林
2024/10/30
1340
Java基础系列(四十五):集合之Map
Map是一个接口,代表的是将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值。
山禾说
2019/01/21
6720
Java 8 中 Map 骚操作之 merge() 的用法
Java 8 最大的特性无异于更多地面向函数,比如引入了 lambda等,可以更好地进行函数式编程。前段时间无意间发现了 map.merge() 方法,感觉还是很好用的,此文简单做一些相关介绍。首先我们先看一个例子。
搜云库技术团队
2020/06/04
1.5K0
Java 8 中 Map 骚操作之 merge() 的用法
Map接口在1.8版本新增的几个方法
这可以说是最常用的方法了吧,获取指定key的value,当key不存在的时候返回一个默认值,也就是第二个参数.
呼延十
2019/06/26
5850
设计模式面试点汇总
设计模式面试点汇总 我们会在这里介绍我所涉及到的设计模式相关的面试点,本篇内容持续更新 我们会介绍下述设计模式的相关面试点: 单例模式 单例模式 下面我们来介绍单例模式的相关面试点 五种单例模式实现方式 我们下面来介绍单例模式的五种实现方式 饿汉式 我们给出饿汉式构建单例模式的基本框架: /*饿汉式*/ public class Singleton implements Serializable{ // 首先我们需要拥有一个私有的构造方法(为了防止其他对象调用构造方法产生新对象)
秋落雨微凉
2022/12/07
2540
JDK源码分析-Map
Map 是一个接口,它表示一种“键-值(key-value)”映射的对象(Entry),其中键是不重复的(值可以重复),且最多映射到一个值(可以理解为“映射”或者“字典”)。
WriteOnRead
2019/08/16
4020
JDK源码分析-Map
Java Lambda 解析和使用技巧
lambda 是包着一个函数的对象 lambda 表达式非常简洁优雅。是把动态语言的特性嫁接到静态语言的一个典范。
卢衍飞
2023/02/16
1.2K0
JAVA知识回顾之Java8 Merge
putIfAbsent()是必要的,否则代码会在第一次出现未知的单词时中断,另外map.get(word) 里面map.put() 有点尴尬。
Jetpropelledsnake21
2022/09/29
3320
JDK 工具类之 Collections 2
/** * Returns a synchronized (thread-safe) map backed by the specified * map. In order to guarantee serial access, it is critical that * <strong>all</strong> access to the backing map is accomplished * through the returned map.<p>
一个会写诗的程序员
2022/05/13
3860
【JDK1.8】JDK1.8集合源码阅读——总章
  今天开始阅读jdk1.8的集合部分,平时在写项目的时候,用到的最多的部分可能就是Java的集合框架,通过阅读集合框架源码,了解其内部的数据结构实现,能够深入理解各个集合的性能特性,并且能够帮助自己在今后的开发中避免犯一些使用错误。另外笔者自己也是摸着石头过河,如果有描述不当的地方,希望园友们能够不吝指出,希望能够和大家共同进步!
joemsu
2019/05/25
4640
Map在Java 8中增加非常实用哪些函数接口?
Map中的新方法 相比 Collection,Map中加入了更多的方法! forEach() 该方法签名为void forEach(BiConsumer<? super K,? super V> ac
码农架构
2021/02/08
2.2K0
java面试基础篇(一)
Q:HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
小菜的不能再菜
2019/09/18
5210
java面试基础篇(一)
【Java性能优化】Map.merge()方法:告别繁琐判空,3行代码搞定统计累加!
在日常开发中,我们经常需要对Map中的值进行累加统计。比如统计每年的项目投入率总和,很多同学会写出这样的代码:
摘星.
2025/05/20
1400
别再这么写代码了,这几个方法不香吗?
JDK8 应该是 Java 中最坚挺一个版本,这个版本新增很多特性,让我们开发起来多了很多便利。
andyxh
2021/03/04
8890
别再这么写代码了,这几个方法不香吗?
Lambda表达式你会用吗?
我们先看看什么是函数。函数是一种最基本的任务,一个大型程序就是一个顶层函数调用若干底层函数,这些被调用的函数又可以调用其他函数,即大任务被一层层拆解并执行。所以函数就是面向过程的程序设计的基本单元。
说故事的五公子
2021/01/21
9590
HashMap高阶用法,十倍提升开发效率
HashMap在工作中使用非常频繁,其实在JDK1.8的时候新增一些更高阶的用法,熟练使用这些方法可以大大提升开发效率,写出更简洁优美的代码。
一灯架构
2022/09/15
2890
HashMap高阶用法,十倍提升开发效率
数据结构?从HashMap的源码分析开始!
首先,先看下inflateTable方法,这个是初始化HashMap里面的线性表的空间:
大大大大大先生
2018/09/04
3690
数据结构?从HashMap的源码分析开始!
关于 Java Lambda 表达式看这一篇就够了(强烈建议收藏)
Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法。实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过invokedynamic指令来实现Lambda表达式的。具体原理放到下一篇。本篇我们首先感受一下使用Lambda表达式带来的便利之处。
张乘辉
2022/04/01
3.1K1
关于 Java Lambda 表达式看这一篇就够了(强烈建议收藏)
巧用HashMap一行代码统计单词出现次数
JDK是在一直在迭代更新的,很多我们熟悉的类也悄悄的添加了一些新的方法特性。比如我们最常用的HashMap。
程序那些事
2020/09/03
4960
相关推荐
聊聊Elasticsearch的ConcurrentMapLong
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验