【并发编程系列】putIfAbsent和getOrDefault用法
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 一.putIfAbsent
- 1.基本介绍
- 2.putIfAbsent 方法
- 3.putIfAbsent 的并发安全性
- 二.getOrDefault
- 1.getOrDefault 方法
- 2.示例代码
- 3.使用场景
一.putIfAbsent
1.基本介绍
在 Java 中,putIfAbsent
和 getOrDefault
是用于 Map
接口的两个不同的方法,下面分别解释 putIfAbsent
和 getOrDefault
的用法。
2.putIfAbsent 方法
putIfAbsent
方法用于向映射中添加键值对,但仅在指定的键尚不存在时才添加。如果指定的键已经存在,则不会执行添加操作。该方法常用于确保在并发环境中不会重复添加相同的键值对。以下是示例代码:
import java.util.HashMap;
import java.util.Map;public class PutIfAbsentExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("key1", 10);map.putIfAbsent("key1", 20); // 不会覆盖现有键值对map.putIfAbsent("key2", 30);System.out.println(map); // 输出: {key1=10, key2=30}}
}
3.putIfAbsent 的并发安全性
putIfAbsent
方法在 Java 中通常用于并发环境中的 ConcurrentMap
实现,例如 ConcurrentHashMap
。这个方法的设计是为了在多线程环境下安全地执行添加操作,确保在同一时间只有一个线程能够成功地将键值对添加到映射中。
在 ConcurrentHashMap
中,putIfAbsent
方法使用了一种称为 “compare-and-swap”(CAS)的机制来确保原子性。CAS 是一种多线程同步的技术,它比传统的锁定机制更轻量级。
在 putIfAbsent
方法中,首先会尝试用给定的键检索值,然后只有在该键不存在时才尝试添加。整个过程是原子性的,因此在并发情况下,多个线程可以同时调用 putIfAbsent
方法,但只有一个线程最终会成功地将键值对添加到映射中。
以下是一个简单的示例,演示了在并发情况下使用 ConcurrentHashMap
中的 putIfAbsent
方法:
import java.util.concurrent.ConcurrentHashMap;public class ConcurrentExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();// 线程1尝试添加键值对new Thread(() -> {Integer value = concurrentMap.putIfAbsent("key", 1);System.out.println("Thread 1 - Added: " + value);}).start();// 线程2尝试添加相同的键值对new Thread(() -> {Integer value = concurrentMap.putIfAbsent("key", 2);System.out.println("Thread 2 - Added: " + value);}).start();}
}
在这个例子中,只有一个线程最终会成功地将键值对添加到映射中,而另一个线程会得到 putIfAbsent
方法返回的已存在的值。
putIfAbsent
方法在 ConcurrentMap
中提供了一种并发安全的方式来添加元素,适用于多线程环境。
二.getOrDefault
1.getOrDefault 方法
getOrDefault
方法用于获取指定键的值,如果该键不存在,则返回一个默认值。这个方法对于避免检查键是否存在并处理默认值很有用。
2.示例代码
import java.util.HashMap;
import java.util.Map;public class GetOrDefaultExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("key1", 10);map.put("key2", 20);int value1 = map.getOrDefault("key1", 0); // 存在的键,返回对应的值int value3 = map.getOrDefault("key3", 0); // 不存在的键,返回默认值 0System.out.println(value1); // 输出: 10System.out.println(value3); // 输出: 0}
}
3.使用场景
getOrDefault
方法在 Java 中的 Map
接口中定义,它用于获取指定键对应的值,如果键不存在,则返回一个默认值。这个方法在许多场景下都非常有用,特别是在处理默认值或避免空指针异常的情况下。以下是一些常用的地方:
-
避免空指针异常: 当你使用传统的
get
方法获取值时,如果键不存在,返回的是null
。使用getOrDefault
可以避免因为空值而引发空指针异常。Map<String, Integer> map = new HashMap<>(); Integer value = map.getOrDefault("key", 0); // 如果键不存在,返回默认值 0
-
处理默认值: 当你需要获取一个值,如果键不存在则使用一个默认值,而不是
null
。Map<String, String> config = getConfig(); // 从某处获取配置信息的映射 String username = config.getOrDefault("username", "guest"); // 如果键不存在,返回默认用户名 "guest"
-
统计元素出现的次数: 在统计元素出现次数时,可以使用
getOrDefault
来为不存在的元素提供一个默认的计数值。Map<String, Integer> wordCount = new HashMap<>(); String word = "apple";// 统计单词出现次数 wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
-
初始化映射: 在初始化映射时,可以使用
getOrDefault
设置默认值。Map<String, List<String>> userRoles = new HashMap<>();// 初始化用户角色列表 userRoles.put("admin", userRoles.getOrDefault("admin", new ArrayList<>()));
getOrDefault
是一个很方便的方法,可以简化代码,提高可读性,并且在处理映射中的键值对时提供了灵活性。
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
相关文章:

【并发编程系列】putIfAbsent和getOrDefault用法
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

人力资源智能化管理项目(day01:基础架构拆解)
学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈 一、基础架构拆解 1.拉取模板代码 git clone GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template 项目名 2.core-js…...

JAVA ORM Bee的设计模式分析
创建型 工厂模式(Factory Pattern) 日志工厂 LoggerFactory 静态工厂模式 *(Static Factory) BeeFactoryHelper 单例模式(Singleton Pattern) 使用单例模式管理系统的配置信息 HoneyConfig 建…...

go语言(三)----函数
1、函数单变量返回 package mainimport "fmt"func fool(a string,b int) int {fmt.Println("a ",a)fmt.Println("b ",b)c : 100return c}func main() {c : fool("abc",555)fmt.Println("c ",c)}2、函数多变量返回 pack…...

鸿蒙原生应用/元服务开发-延迟任务说明(一)
一、功能介绍 应用退至后台后,需要执行实时性要求不高的任务,例如有网络时不定期主动获取邮件等,可以使用延迟任务。当应用满足设定条件(包括网络类型、充电类型、存储状态、电池状态、定时状态等)时,将任务…...

正信晟锦:借钱一直都不还可以起诉吗
在日常生活中,我们可能会遇到一些经济困难,需要向亲朋好友或者金融机构借款。然而,有些人在借款后并没有按照约定的时间还款,甚至一直拖欠不还。这种情况下,债权人是否可以起诉债务人呢?答案是肯定的。 我们需要明确的…...

npm run dev 启动vue的时候指定端口
使用的是 Vue CLI 来创建和管理 Vue 项目, 可以通过设置 --port 参数来指定启动的端口号。以下是具体的步骤: 打开命令行终端 进入您的 Vue 项目目录 运行以下命令,通过 --port 参数指定端口号(例如,这里设置端口号…...

深度学习|16.1 词表示、embedding
文章目录 词表示one-hot编码 embedding编码工具t-SNE——将多维空间投射到二维平面 词表示 one-hot编码 若有n类词,则用n维向量对单个类进行区分。在这个n维向量里面第i维为1,则说明这是第i个词,并且要求其他位置都是为0. embedding编码 每…...

.NetRSA签名(调的JAVA的接口)
公共类: using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates;namespace CommonUtils {/// <summary>/// 将私钥&…...

CSS||选择器
目录 作用 分类 基础选择器 标签选择器 编辑类选择器 id选择器 通配符选择器 作用 选择器(选择符)就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说,就是选择标签用的。 选择器的使用一共分为两步: 1.…...

几种常见的算法
一、冒泡排序法 冒泡排序法 原始数据:3 2 7 6 8 第1次循环:(最大的跑到最右边) 2 3 7 6 8(3和2比较,2<3 所以2和3交换位置) 2 3 7 6 8(3和7比较,3<7 所以不需要交…...

原生的cURL函数而不是 tp6框架的Http类,curl_init()、curl_setopt()和curl_exec()等cURL函数
GET请求示例: // 初始化 cURL $ch curl_init(); // 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, https://example.com/api/resource); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行 cURL 并获取返回结果 $response curl_exec($ch); // 关闭 cURL…...

Win10下在Qt项目中配置SQlite3环境
资源下载 官网资源:SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def,sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…...

Sentinel 轨道数据及下载
Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息,对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用: 地理校正ÿ…...

MD5 加密
任务: 接到一个任务,调用对方的接口,内容和密码,需要使用md5进行加密,再发送请求。 参数说明: 参数名称 说明 备注 timespan 时间戳 格式为yyyyMMddHHmmss pwd 密码 此处用原始密码时间戳做MD5加…...

在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案
在 Excel 中,有时候我们需要将某一列的所有值连接在一起,并且每个值用单引号括起来,同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案: 方…...

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?
Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架,关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了,大家可以参考官网及相关源码,我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”,只要追根朔…...

2024 前端高频面试题之 HTML/CSS 篇
【前言】随着市场的逐渐恶劣,通过总结面试题的方式来帮助更多的coder,也是记录自己的学习过程,温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化?2、块级元素&内联样式3、盒子模型的理解&…...

实现将信息作为txt,pdf,图片的形式保存到电脑~
PrintableUtils作为输出信息的工具类: package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; im…...

服务器变矿机,该如何应对?
开始 恶意的挖矿程序会导致服务器cpu的异常占用,很让人讨厌。起初,我只是使用top命令显示出占用cpu不正常的进程,发现其中一个进程占用了百分之九十九点几,然后通过kill -9 <PID>命令干掉它。但总是过不了几天,…...

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现: 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置…...

【Webpack】预处理器 - 常用loader介绍
选用合适的loader来处理不同的资源和不同的功能,以下是一些主流的loader,但这并不是全部,因为每时每刻都可能有新的loader 发布到 npm上 babel-loader babe-loader 用来处理ES6并将其编译为ESS,它使我们能够在最新的工程中使用最…...

lodash 的 _.groupBy 函数是怎么实现的?
说在前面 🎈lodash的_.groupBy函数可以将一个数组按照给定的函数分组,返回一个新对象。该函数接收两个参数:第一个参数是要进行分组的数组,第二个参数是用于分组的函数。该函数会对数组中的每个元素进行处理,返回一个值…...

(2024,ViM,双向 SSM 骨干,序列建模)利用双向状态空间模型进行高效视觉表示学习
Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0.摘要 3. 方法 3.1. 基础知识 3.…...

docker容器和常用命令
1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …...

【征服redis9】快速征服lua脚本
lua脚本,这个名字总让人想歪,不过老外发明名字,我们只能跟着叫了。这个脚本语言在redis里和Nginx里都有用,所以我们就来看一下。 目录 1 lua的介绍与说明 2 lua的基本语句体验 3.Lua的数据结构和高级特性 1 lua的介绍与说明 …...

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变
vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格: 子…...

GBASE南大通用分享,如何修改可信上下文
在以下示例中,假设该可信上下文对象 appserver 存在并启用。以下的 ALTER TRUSTED CONTEXT 语句将 appserver 可信上下文对象的对象方式重置为 DISABLE。当其处于该方式时, appserver 可信上下文仍然存在,但是它不能用于存取数据库服务器。 …...

冻结Prompt微调LM: T5 PET (a)
T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt,所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…...

119 BFS和DFS解二叉树的所有路径
问题描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。 DFS求解:定义一个全局的链表,用来装所有的结果,通过DFS遍历,一旦遍历到当前节点没有子节点…...