易懂Java源码角度分析put()与putIfAbsent()的区别——源码分析系列

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了易懂Java源码角度分析put()与putIfAbsent()的区别——源码分析系列相关的知识,希望对你有一定的参考价值。

一、put()方法

1. 源码分析

Java中并未给出put()的源码,因此我们看一下put()方法中给出的注释:

Associates the specified value with the specified key in this map (optional operation). If the map previously contained a mapping for the key, the old value is replaced by the specified value. (A map m is said to contain a mapping for a key k if and only if m.containsKey(k) would return true.)

翻译过来就是:将key与value映射,如果在此之前存在以key为名称的映射对,则用新映射替换原来的旧映射。

2. 用法

Map<Integer, Integer>map = new HashMap<>();	// 定义一个map
map.put(1,2);			// 其中1是key,2是value


二、putIfAbsent()

Map容器内putIfAbsent()方法的源码:

1. 源码分析

    default V putIfAbsent(K key, V value) {
        V v = get(key);	// 首先调用get(key)方法,查看map中是否已经存在key值相同的键值对
        if (v == null) {	// 如果不存在,则调用put()方法插入键值对
            v = put(key, value);
        }
        return v;			// 返回该键值对
    }

也就是说,putIfAbsent()的作用是为map赋初值。


2. 用法

Map<Integer, Integer>map = new HashMap<>();	// 定义一个map
map.putIfAbsent(1,0);// 查看key为1的值是否存在,如果不存在,将其value的值初始化为0

扩展用法:若映射不存在,则建立映射,并赋初值,若存在,则进行其他操作

Map<Integer, Integer>map = new HashMap<>();	// 定义一个map
if(map.putIfAbsent(1,0) == null) 
	System.out.println("该映射不存在,建立映射并赋初值");
else {
	System.out.println("该映射存在,进行其他操作");
}


三、二者区别

put()方法的作用是为map赋值,当存在相同的键值对时,会用新值覆盖旧值。
putIfAbsent()的作用是是为map赋初值,若存在相同的键值对,则不会进行操作。

以上是关于易懂Java源码角度分析put()与putIfAbsent()的区别——源码分析系列的主要内容,如果未能解决你的问题,请参考以下文章

从Java源码的角度来分析HashMap与HashTable的区别

源码角度了解阻塞队列之ArrayBlockingQueue

从源码角度认识 ArrayList ,LinkedList与 HashMap

通俗易懂之Tomcat源码分析——初始化与启动

数据结构算法 - ConcurrentHashMap 源码解析

简单易懂的ArrayList源码分析