难题:嵌套computeIfAbsent

总览

Java 8库在地图上有一个新方法,computeIfAbsent。 这是一种非常有用的将地图变成与键关联的对象的缓存的方法。

但是,您可能没有考虑过一种组合。 如果您在内部调用computeIfAbsent会发生什么。

map.computeIfAbsent(Key.Hello, s -> {map.computeIfAbsent(Key.Hello, t -> 1);return 2;
});enum Key {Hello}

尽管这在简单的情况下看起来很奇怪,但是在更复杂的代码中,您可能会偶然地这样做(就像我今天下午所做的那样)那么会发生什么呢? 好吧,这取决于您使用的集合。

HashMap: {Hello=2}
WeakHashMap: {Hello=2}
TreeMap: {Hello=2}
IdentityHashMap: {Hello=2}
EnumMap: {Hello=2}
Hashtable: {Hello=2, Hello=1}
LinkedHashMap: {Hello=1, Hello=2}
ConcurrentSkipListMap: {Hello=1}
ConcurrentHashMap:

注意: ConcurrentHashMap永不返回。 它的锁定似乎没有重入。

ConcurrentSkipListMap具有最合理的结果,保留第一个添加的值。 如果令人困惑,Hello = 2对于这种不确定的情况是合理的,因为它是第二个值而不是第一个值。 没有什么意义的是让唯一的不可变键出现两次。

不幸的是,ConcurrentHashMap死锁本身是不幸的,但至少不是那么微妙。

完整的代码。

public class A {public static void main(String[] args) {for (Map map : new Map[]{new HashMap<>(),new WeakHashMap<>(),new TreeMap<>(),new IdentityHashMap<>(),new EnumMap<>(Key.class),new Hashtable<>(),new LinkedHashMap<>(),new ConcurrentSkipListMap<>(),new ConcurrentHashMap<>()}) {System.out.print(map.getClass().getSimpleName() + ": ");map.computeIfAbsent(Key.Hello, s -> {map.computeIfAbsent(Key.Hello, t -> 1);return 2;});System.out.println(map);}}enum Key {Hello}
}

方法compute()具有相似的结果

HashMap: {Hello=null2}
WeakHashMap: {Hello=null2}
TreeMap: {Hello=null2}
IdentityHashMap: {Hello=null2}
EnumMap: {Hello=null2}
Hashtable: {Hello=null2, Hello=1}
LinkedHashMap: {Hello=1, Hello=null2}
ConcurrentSkipListMap: {Hello=12}

ConcurrentHashMap:

public class A {public static void main(String[] args) {for (Map map : new Map[]{new HashMap<>(),new WeakHashMap<>(),new TreeMap<>(),new IdentityHashMap<>(),new EnumMap<>(Key.class),new Hashtable<>(),new LinkedHashMap<>(),new ConcurrentSkipListMap<>(),new ConcurrentHashMap<>()}) {System.out.print(map.getClass().getSimpleName() + ": ");map.compute(Key.Hello, (s, v) -> {map.compute(Key.Hello, (s2, v2) -> "1");return v + "2";});System.out.println(map);}}enum Key {Hello}
}

结论

如果您要在lambda内部嵌套对地图的调用,则需要特别小心,或者完全避免这样做。 如果必须这样做,ConcurrentSkipListMap似乎表现最佳。

翻译自: https://www.javacodegeeks.com/2015/05/puzzler-nested-computeifabsent.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python扩展文件_1. 使用 C 或 C++ 扩展 Python

1.12.给扩展模块提供C API很多扩展模块提供了新的函数和类型供Python使用&#xff0c;但有时扩展模块里的代码也可以被其他扩展模块使用。例如&#xff0c;一个扩展模块可以实现一个类型 "collection" 看起来是没有顺序的。就像是Python列表类型&#xff0c;拥有C AP…

swal ajax,Sweetalert详细介绍

好长时间没有更新文章了&#xff0c;年底工作比较忙&#xff0c;确实是没有时间来写文章。今天忙里偷闲&#xff0c;总结了一款前端提示框的插件——sweetalert——推荐给大家。Sweetalert安装Sweetalert官方为我们提供了三种安装方式&#xff1a;方法一 通过bower安装$ bower …

构造函数必须没有代码

构造函数中应完成多少工作&#xff1f; 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样&#xff0c;当对象方法需要结果时&#xff0c;我们将准备好它们。 听起来是个好方法&#xff1f; 不&#xff0c;这不对。 这是一个坏主意&#xff0c;原因有一个&#xff1a…

一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...

前几天咱们了解&#xff1a;三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip&#xff1f;什么又是内网ip&#xff1f;为什么ip地址通常以192.168开头&#xff1f;也学习了&#xff1a;二、三层交换机与路由器的区别&#xff01;但是有好多人对IP这个概念还是不太清…

服务器appcrash的问题怎么修复,win7的ie出现APPCRASH问题怎么处理?

问题事件名称: APPCRASH 怎么解决?这是Win7或者是Vista特有的一个棘手的问题.APPCRASH(app是程序的意思&#xff0c;crash是坠机的意思。就是程序崩溃了/程序撞车……)(APPCRASH是Win7和Vista中特有的故障&#xff0c;就是程序崩溃引起APPCRASH错误的问题很多 如dll加载错误 软…

Jira 随便总结

一、JIRA与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 JIRA创建的问题类型包括New Feature、Bug、Task和Improvement四种&#xff0c;还可以自己定义&#xff0c;所以它也一是过程管理系统。 JIR…

http 路径 |_HTTP 请求與响应的格式及 curl 命令使用

介绍 HTTP&#xff0c;主要内容有HTTP 请求包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 请求内容HTTP 响应包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 响应内容如何使用 curl 命令HTTP 请求的格式1 动词 路径 协议/版本 2 Key1: value1 2 Key2: v…

A new start!

从今天起&#xff0c;开始每天晚上拿出来半个小时到一个小时的时间来总结今天我做的那些事情&#xff0c;有哪些进步&#xff0c;有哪些不足&#xff0c;有哪些心得和笔记。 以前的学习都是每天学完就往脑袋后面一放&#xff0c;导致很多东西当时学会了&#xff0c;但是后面就都…

华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...

众所周知&#xff0c;无论是手机&#xff0c;还是电脑&#xff0c;我们所使用的系统到了一定的时间&#xff0c;都会进行“系统更新”&#xff0c;尤其是我们使用的苹果手机、华为手机等&#xff0c;就经常会跳出提示&#xff0c;提醒用户“更新系统”&#xff0c;尤其是当我们…

Apache骆驼丝攻示例

如果您想监视&#xff0c;调试&#xff0c;排除流经路由的消息&#xff0c;而又不必从通道中永久消耗消息&#xff0c;那么就需要使用电线 。 有线分流器充当接收者列表&#xff0c;该列表消耗输入通道之外的消息并将其发布到两个输出通道。 第一个是作为主要信道的实际目的地…

微软的翻译书签

http://labs.microsofttranslator.com/bookmarklet/1.选择语言; 2.添加 Translate 链接到收藏夹或书签. 转载于:https://www.cnblogs.com/del/p/3391181.html

参考文献中会议名称怎么缩写_期刊缩写查询总结

介绍英文论文写作中&#xff0c;经常会插入参考文献。那么参考文献中的期刊名称&#xff0c;时常需要使用缩写。但是有时候&#xff0c;查了半天&#xff0c;怎么也查不着&#xff0c;让人抓狂。今天小编总结了几个查询期刊缩写的网址&#xff0c;方便大家进行期刊缩写的查询。…

ET的异常翻译

前段时间&#xff0c;我写了一篇有关用AspectJ进行异常转换的小博客文章。 在此博客文章中&#xff0c;我们将看到如何使用ET及其较轻的Java 8方法来完成相同的任务。 动机 异常转换&#xff08;或异常转换&#xff09;是将一种类型的异常转换为另一种类型的过程。 转换异常的…

7. SVM松弛变量

我们之前讨论的情况都是建立在样例线性可分的假设上&#xff0c;当样例线性不可分时&#xff0c;我们可以尝试使用核函数来将特征映射到高维&#xff0c;这样很可能就可分了。然而&#xff0c;映射后我们也不能100%保证可分。那怎么办呢&#xff0c;我们需要将模型进行调整&…

mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上

简介今天在迁移zabbix的数据库&#xff0c;每次链接到自己的mysql都报错&#xff0c;mysqlAuthentication plugin caching_sha2_password cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_passwordzabbix总是提示**** MySQL server is not available. Waiting 5 secon…

关于Servlet和异步Servlet

Servlet API是Java EE标准的一部分&#xff0c;自1998年正式发布2.1规范以来&#xff0c;一直是基于Java的企业体系结构的重要组成部分。 它是一种自以为是的API&#xff0c;用于服务围绕一些基本概念构建的请求/响应协议&#xff1a; 兼容的容器 &#xff0c;这是一个专用的…

linux c++ 运行时报 段错误 的一个原因

很长时间没有写 c/c了 这次依据一些代码写了一个linux上的小东西&#xff0c;结果在运行时用new 创建对象的时候&#xff0c;报: 段错误 有可能还出现如下报错信息: *** glibc detected *** ./selectServer: malloc(): memory corruption: 0x0000000000fba740 *** 研究了一会儿…

mysql主键和聚簇索引_[MySQL] innoDB引擎的主键与聚簇索引

mysql的innodb引擎本身存储的形式就必须是聚簇索引的形式 , 在磁盘上树状存储的 , 但是不一定是根据主键聚簇的 , 有三种情形:1. 有主键的情况下 , 主键就是聚簇索引2. 没有主键的情况下 , 第一个非空null的唯一索引就是聚簇索引3. 如果上面都没有 , 那么就是有一个隐藏的row-i…

JPA数据库架构生成

一段时间以来&#xff0c; JPA的大多数主要实现&#xff0c;例如Hibernate &#xff0c; EclipseLink或OpenJPA &#xff0c;都提供了生成数据库模式对象的方法。 这些包括表&#xff0c;主键&#xff0c;外键&#xff0c;索引和其他对象的生成。 不幸的是&#xff0c;当处理多…

ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

近期项目中可能要用到Flash存取数据&#xff0c;并与JS互调&#xff0c;所以就看了一下ActionScript 3.0&#xff0c;现把学习结果分享一下&#xff0c;希望对新手有帮助。 目录 ActionScript 3.0简介 Hello World 文件读写 数据存储(SharedObject) 与JS互调 ActionScript 3.0简…