最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java computeIfAbsent()方法使用小結(jié)

 更新時間:2025年12月04日 11:11:13   作者:Geoking.  
本文主要介紹了Java computeIfAbsent()方法使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

在 Java 編程中,我們經(jīng)常需要在 Map 中保存一些“鍵對應(yīng)的集合”或“鍵對應(yīng)的統(tǒng)計信息”。

傳統(tǒng)寫法往往繁瑣,比如:

Map<String, List<String>> map = new HashMap<>();

if (!map.containsKey("Java")) {
    map.put("Java", new ArrayList<>());
}
map.get("Java").add("Tom");

是不是有點(diǎn)啰嗦?
從 Java 8 開始,我們可以用一行優(yōu)雅的代碼解決:

map.computeIfAbsent("Java", k -> new ArrayList<>()).add("Tom");

這就是今天的主角 —— computeIfAbsent()。

二、方法定義

computeIfAbsent()Map 接口的一個默認(rèn)方法,定義如下:

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

方法說明:

參數(shù)類型含義
keyK要計算或查找的鍵
mappingFunctionFunction<? super K, ? extends V>當(dāng)鍵不存在時,用于生成新值的函數(shù)

返回值:

  • 如果鍵已存在,返回原來的值;
  • 如果鍵不存在,則使用 mappingFunction 計算出一個新值,并放入 Map;
  • 如果函數(shù)返回 null,則不會插入任何值。

三、基本使用示例

import java.util.*;

public class ComputeIfAbsentDemo {
    public static void main(String[] args) {
        Map<String, List<String>> courseMap = new HashMap<>();

        // 當(dāng)鍵不存在時,創(chuàng)建新列表
        courseMap.computeIfAbsent("Java", k -> new ArrayList<>()).add("Tom");
        courseMap.computeIfAbsent("Java", k -> new ArrayList<>()).add("Alice");
        courseMap.computeIfAbsent("Python", k -> new ArrayList<>()).add("Bob");

        System.out.println(courseMap);
    }
}

輸出:

{Java=[Tom, Alice], Python=[Bob]}

? computeIfAbsent() 自動處理了鍵的初始化邏輯,讓代碼更簡潔。

四、常見應(yīng)用場景

可參考如下題目熟練使用 computeIfAbsent()

49. 字母異位詞分組 - 力扣(LeetCode)

五、與其他方法的區(qū)別

方法說明使用場景
putIfAbsent(key, value)如果 key 不存在,則放入指定的 value固定值插入
computeIfAbsent(key, func)如果 key 不存在,使用函數(shù)生成 value動態(tài)計算值
computeIfPresent(key, func)如果 key 存在,重新計算并更新 value修改已有值
compute(key, func)無論存在與否,都重新計算全面控制更新邏輯
merge(key, value, remappingFunction)合并新舊值統(tǒng)計與聚合

六、底層實(shí)現(xiàn)源碼分析(以HashMap為例)

摘自 HashMap.java

public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    Node<K,V> e;
    V v;
    if ((e = getNode(hash(key), key)) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            putVal(hash(key), key, newValue, false, true);
            return newValue;
        }
    } else if ((v = e.value) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            e.value = newValue;
            return newValue;
        }
    } else {
        return v;
    }
    return null;
}

簡而言之:

  • 如果 key 存在,直接返回 value;
  • 如果不存在,則調(diào)用 mappingFunction.apply(key);
  • 若返回非空,則插入并返回;
  • 否則不插入。

七、注意事項 ??

  1. 不要讓 mappingFunction 產(chǎn)生副作用
map.computeIfAbsent("x", k -> {
    // ? 不要在這里修改 map 自身!
    map.put("y", "test");
    return "value";
});

否則可能引發(fā) ConcurrentModificationException

  1. 避免返回 null

如果函數(shù)返回 null,則不會插入任何值。

map.computeIfAbsent("key", k -> null);
// 不會添加任何條目
  1. 線程安全
    • 普通 HashMap 不是線程安全的;
    • 若需并發(fā)環(huán)境,請使用 ConcurrentHashMap;
    • ConcurrentHashMap 也支持 computeIfAbsent(),且是線程安全版本。

到此這篇關(guān)于Java computeIfAbsent()方法使用小結(jié)的文章就介紹到這了,更多相關(guān)Java computeIfAbsent() 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • kotlin中const 和val的區(qū)別及使用場景分析

    kotlin中const 和val的區(qū)別及使用場景分析

    在 Kotlin 中,const 和 val 都是用來聲明常量的,但它們的使用場景和功能有所不同,下面給大家介紹kotlin中const 和val的區(qū)別,感興趣的朋友一起看看吧
    2025-04-04
  • Springboot中yml文件不生效原因分析及解決

    Springboot中yml文件不生效原因分析及解決

    這篇文章給大家介紹了Springboot中yml文件不生效原因分析及解決方法,通過圖文給大家講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • JAVA 十六進(jìn)制與字符串的轉(zhuǎn)換

    JAVA 十六進(jìn)制與字符串的轉(zhuǎn)換

    筆者前幾日在開服過程中需要將字符串轉(zhuǎn)化成為16進(jìn)制的字符串,在網(wǎng)上找到了一些方法嘗試之后,均發(fā)現(xiàn)存在一個問題-->字符串轉(zhuǎn)為16進(jìn)制后再轉(zhuǎn)回來,英文正常,中文出現(xiàn)亂碼
    2009-05-05
  • SpringBoot如何實(shí)現(xiàn)接口版本控制

    SpringBoot如何實(shí)現(xiàn)接口版本控制

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)接口版本控制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中正則表達(dá)式 .* 的含義講解

    Java中正則表達(dá)式 .* 的含義講解

    這篇文章主要介紹了Java中正則表達(dá)式 .* 的含義,通過舉例說明了正則表達(dá)式*,+,?的區(qū)別,本文給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • java org.springframework.boot 對redis操作方法

    java org.springframework.boot 對redis操作方法

    在Spring Boot項目中操作Redis,你可以使用Spring Data Redis,Spring Data Redis是Spring提供的一個用于簡化Redis數(shù)據(jù)訪問的模塊,它提供了一個易于使用的編程模型來與Redis交互,本文給大家介紹java org.springframework.boot 對redis操作方法,感興趣的朋友一起看看吧
    2025-04-04
  • Java詳解數(shù)據(jù)類型的定義與使用

    Java詳解數(shù)據(jù)類型的定義與使用

    Java 是一種類型安全語言,編譯器存儲在變量中的數(shù)值具有適當(dāng)?shù)臄?shù)據(jù)類型。學(xué)習(xí)任何一種編程語言都要了解其數(shù)據(jù)類型,本文將詳細(xì)介紹 Java 中的數(shù)據(jù)類型
    2022-04-04
  • Java利用條件運(yùn)算符的嵌套來完成學(xué)習(xí)成績的劃分

    Java利用條件運(yùn)算符的嵌套來完成學(xué)習(xí)成績的劃分

    這篇文章主要介紹了Java利用條件運(yùn)算符的嵌套來完成學(xué)習(xí)成績的劃分,需要的朋友可以參考下
    2017-02-02
  • mybatis?plus框架@TableField注解不生效問題及解決方案

    mybatis?plus框架@TableField注解不生效問題及解決方案

    最近遇到一個mybatis plus的問題,@TableField注解不生效,導(dǎo)致查出來的字段反序列化后為空,今天通過本文給大家介紹下mybatis?plus框架的@TableField注解不生效問題總結(jié),需要的朋友可以參考下
    2022-03-03
  • spring-integration連接MQTT全過程

    spring-integration連接MQTT全過程

    這篇文章主要介紹了spring-integration連接MQTT全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

绥滨县| 清新县| 招远市| 和林格尔县| 临漳县| 都兰县| 宁河县| 海原县| 绵竹市| 阜阳市| 水城县| 斗六市| 来安县| 拉孜县| 靖州| 霞浦县| 格尔木市| 延寿县| 连云港市| 田阳县| 民丰县| 元谋县| 通渭县| 灵丘县| 和平区| 西藏| 凯里市| 华亭县| 垣曲县| 波密县| 古蔺县| 盘山县| 格尔木市| 成武县| 抚宁县| 泸定县| 视频| 贵阳市| 喀什市| 汪清县| 株洲市|