put与putIfAbsent区别:

put在放入数据时,如果放入数据的key已经存在与Map中,最后放入的数据会覆盖之前存在的数据,

而putIfAbsent在放入数据时,如果存在重复的key,那么putIfAbsent不会放入值。

putIfAbsent如果传入key对应的value已经存在,就返回存在的value,不进行替换。如果不存在,就添加key和value,返回null

底层实现:public V put(K key, V value) {

if (value == null)

throw new NullPointerException();

int hash = hash(key.hashCode());

return segmentFor(hash).put(key, hash, value, false); } public V putIfAbsent(K key, V value) {

if (value == null)

throw new NullPointerException();

int hash = hash(key.hashCode());

return segmentFor(hash).put(key, hash, value, true); }

例子:package com.xx;import java.util.HashMap;import java.util.Map;/**

* JustForTest

*

* @create 2018-06-20 12:14

*/public class TestHan {

public static void main(String[] args) {

/**

* put

*/

Map map = new HashMap<>();

map.put(1,"ZhangSan");

map.put(2,"LiSi");

map.put(1,"WangWu");

map.forEach((key,value) ->{

System.out.println("key : " + key + " , value : " + value);

});

/**

* putIfAbsent

*/

Map putIfAbsentMap = new HashMap<>();

putIfAbsentMap.put(1,"张三");

putIfAbsentMap.put(2,"李四");

putIfAbsentMap.put(1,"王五");

putIfAbsentMap.forEach((key,value) ->{

System.out.println("key : " + key + " , value : " + value);

});

}}

输出结果:

key : 1 , value : WangWu

key : 2 , value : LiSi

key : 1 , value : 张三

key : 2 , value : 李四package com.xx;import com.alibaba.fastjson.JSON;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/**

* JustForTest

*

* @create 2018-06-20 12:14

*/public class TestHan {

/**

* 处理重复数据与不重复数据,以重复数据为唯一,合并数据的方法。

*/

public static void main(String[] args) {

List list = new ArrayList<>();

list.add(new Student("张三", 1));

list.add(new Student("李四", 1));

list.add(new Student("王五", 2));

list.add(new Student("赵六", 1));

list.add(new Student("孙七", 2));

list.add(new Student("周八", 1));

list.add(new Student("吴九", 2));

//对于上面的学生、如果根据班级进行区分?!

Map> map = new HashMap<>();

List students;

for(Student s : list) {

/**

* put不管什么直接存入,返回旧值

* putIfAbsent如果为null才存入,返回旧值。

*/

students = map.putIfAbsent(s.getInClass(),new ArrayList(list.size()));

if (null == students) {

students = map.get(s.getInClass());

}

students.add(s);

}

//循环Map

map.forEach((key,value) -> {

System.out.println("班级:" + key + ",人员:" + JSON.toJSONString(value));

});

}}package com.xx;/**

* @author hanliwei

* @create 2018-06-20 16:00

*/public class Student {

private String name; //姓名

private Integer inClass;//所属班级

Student(String name,Integer inClass) {

this.name = name;

this.inClass = inClass;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getInClass() {

return inClass;

}

public void setInClass(Integer inClass) {

this.inClass = inClass;

}}

------------------------------

Java8之Map的其他一些方法

------------------------------Map map = new HashMap<>();map.put(1,"a");map.put(2,"b");map.put(3,"c");/**

* 1.getOrDefault 方法

*

* 如果指定的key存在,则返回该key对应的value,

* 如果不存在,则返回指定的值。

*

* 例子:key为4不存在,输出d

*/System.out.println(map.getOrDefault(4,"d"));

输出:d/**

* 2.forEach 方法

*

* 遍历Map中的所有Entry, 对key, value进行处理,

接收参数 (K, V) -> void,

*/map.forEach((key,value) -> System.out.println("key : " + key + " , value:" + value));

输出:

key : 1 , value:a

key : 2 , value:b

key : 3 , value:c/**

* 3.replaceAll 方法

* 替换Map中所有Entry的value值,这个值由旧的key和value计算得出,

接收参数 (K, V) -> V

*/map.replaceAll((key,value) -> ("new" + key) + value);map.forEach((key,value) -> System.out.println("key : " + key + " , value:" + value));

输出:

key : 1 , value:new1a

key : 2 , value:new2b

key : 3 , value:new3c/**

* 4.putIfAbsent 方法

* 如果key关联的value不存在,则关联新的value值,返回key关联的旧的值

*/map.putIfAbsent(3, "d");map.putIfAbsent(4, "d");System.out.println(map.get(3));System.out.println(map.get(4));

输出:

c

d/**

* 5.remove方法

* 接收2个参数,key和value,如果key关联的value值与指定的value值相等(equals),则删除这个元素

*/map.remove(1,"b");System.out.println(map.get(1));//未删除成功,输出amap.remove(2,"b");System.out.println(map.get(2));//删除成功,输出null/**

* 6.replace(K key, V oldValue, V newValue) 方法

* 如果key关联的值与指定的oldValue的值相等,则替换成新的newValue

*/map.replace(3,"a","z");System.out.println(map.get(3));//未替换成功,输出cmap.replace(1,"a","z");System.out.println(map.get(1));//替换成功,输出z/**

* 7.replace(K key, V value) 方法

* 如果map中存在key,则替换成value值,否则返回null

*/// 输出旧的值, aSystem.out.println(map.replace(1, "aa"));// 替换成功,输出新的值, aaSystem.out.println(map.get(1));// 不存在key为4, 输出 nullSystem.out.println(map.replace(4, "d"));// 不存在key为4, 输出 nullSystem.out.println(map.get(4));/**

* 8.computeIfAbsent 方法

* 如果指定的key不存在,则通过指定的K -> V计算出新的值设置为key的值

*/map.computeIfAbsent(1, key -> key + " computed");// 存在key为1,则不进行计算,输出值 aSystem.out.println(map.get(1));map.computeIfAbsent(4, key -> key + " computed");// 不存在key为4,则进行计算,输出值 4 computedSystem.out.println(map.get(4));/**

* 9.computeIfPresent 方法

* 如果指定的key存在,则根据旧的key和value计算新的值newValue,

* 如果newValue不为null,则设置key新的值为newValue,

* 如果newValue为null, 则删除该key的值,

*/map.computeIfPresent(1, (key, value) -> (key + 1) + value);// 存在key为1, 则根据旧的key和value计算新的值,输出 2aSystem.out.println(map.get(1));map.computeIfPresent(2, (key, value) -> null);// 存在key为2, 根据旧的key和value计算得到null,删除该值,输出 nullSystem.out.println(map.get(2));

参考:

java的set和put的区别_put与putIfAbsent区别相关推荐

  1. Java培训教程:”==“和 equals 方法究竟有什么区别?

    在学习java技术过程中,我们会接触到一些变量值的相关知识,本期小编为大家介绍的教程就是关于"=="和 equals 方法究竟有什么区别?来看看下面的详细介绍. Java培训教程: ...

  2. [转]JAVA泛型通配符T,E,K,V区别,T以及ClassT,Class?的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  3. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  4. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  5. class mywnd : pubic qwidget是什么意思_学了这么久java反射,你知道class.forName和classloader的区别吗?...

    前两天头条有朋友留言说使用class.forName找不到类,可以使用classloader加载.趁此机会总结一下,正好看到面试中还经常问到. 一.类加载机制 上面两种加载类的方式说到底还是为了加载一 ...

  6. Java基础之String,StringBuilder,StringBuffer三者的区别

    Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...

  7. java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...

  8. java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...

  9. 探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类

    转载自     探究Java File类中list().listFiles()的使用及区别,认识和使用匿名内部类 内容概要: 1.认识File类: 2.File的构造函数: 3.list()及其重载方 ...

最新文章

  1. 企业架构的过去、现在与未来
  2. 对象的继承关系在数据库中的实现方式和PowerDesigner设计
  3. Electron怎样进行渲染进程调试和使用浏览器和VSCode进行调试
  4. 咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
  5. mysql时间戳在某天内_mysql根据时间戳查询指定日期内数据
  6. 第一个冲刺期的第九天
  7. how Machine Learning service is used in Jeans project
  8. oracle通过执行计划cost,Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引
  9. C++vector容器-容量和大小
  10. vue1升级到vue2的问题
  11. BlockChain:区块链入门课程 -- 区块链应用于能源 POWER LEDGER案例
  12. jquery学习笔记四:ajax
  13. 爆强!将 exe 文件反编译成 Python 脚本!
  14. 无法安装驱动程序 此计算机上不存在英特尔适配器,无法安装驱动程序。此计算机不存在英特尔(R)适配器...
  15. matlab投资组合权重,【原创】投资组合风险-收益关系的Matlab实现
  16. Exception:No serializer found for class and no properties discovered to create BeanSerializer
  17. Keepalived HAProxy应用
  18. js每日一题(10)
  19. The e200z4 MMU 学习笔记
  20. STM32之usart

热门文章

  1. 【云栖大会】阿里巴巴五大平台联合发布创业扶持计划 大生态力量助力创新创业...
  2. Flash动画软件的心得笔记
  3. c#四种线程安全的懒加载单例模式(Lazy、静态内部类、CAS、双重校验)
  4. 浅谈KNN算法原理及python程序简单实现、KD树、球树
  5. Unity接入Google广告(AdMob)
  6. vulnhub VulnOS: 2
  7. Hyperledger技术简介
  8. 【学习笔记】LSTM 李弘毅
  9. 【CCTC 2017】云计算核心技术与实践专场:剖析云计算关键技术,探寻金融、气象行业转型升级之路...
  10. Java 反射 - 指南