易懂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的区别
从源码角度认识 ArrayList ,LinkedList与 HashMap