java的set和put的区别_put与putIfAbsent区别
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区别相关推荐
- Java培训教程:”==“和 equals 方法究竟有什么区别?
在学习java技术过程中,我们会接触到一些变量值的相关知识,本期小编为大家介绍的教程就是关于"=="和 equals 方法究竟有什么区别?来看看下面的详细介绍. Java培训教程: ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及ClassT,Class?的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
- 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...
1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...
- Java中的string定义的两种方法和区别
java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...
- class mywnd : pubic qwidget是什么意思_学了这么久java反射,你知道class.forName和classloader的区别吗?...
前两天头条有朋友留言说使用class.forName找不到类,可以使用classloader加载.趁此机会总结一下,正好看到面试中还经常问到. 一.类加载机制 上面两种加载类的方式说到底还是为了加载一 ...
- Java基础之String,StringBuilder,StringBuffer三者的区别
Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...
- java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...
- java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...
- 探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类
转载自 探究Java File类中list().listFiles()的使用及区别,认识和使用匿名内部类 内容概要: 1.认识File类: 2.File的构造函数: 3.list()及其重载方 ...
最新文章
- 企业架构的过去、现在与未来
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- Electron怎样进行渲染进程调试和使用浏览器和VSCode进行调试
- 咕咚技术总监唐平麟:神策使我们的数据平台成本降低约 75%,迭代效率提升 2~3 倍...
- mysql时间戳在某天内_mysql根据时间戳查询指定日期内数据
- 第一个冲刺期的第九天
- how Machine Learning service is used in Jeans project
- oracle通过执行计划cost,Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引
- C++vector容器-容量和大小
- vue1升级到vue2的问题
- BlockChain:区块链入门课程 -- 区块链应用于能源 POWER LEDGER案例
- jquery学习笔记四:ajax
- 爆强!将 exe 文件反编译成 Python 脚本!
- 无法安装驱动程序 此计算机上不存在英特尔适配器,无法安装驱动程序。此计算机不存在英特尔(R)适配器...
- matlab投资组合权重,【原创】投资组合风险-收益关系的Matlab实现
- Exception:No serializer found for class and no properties discovered to create BeanSerializer
- Keepalived HAProxy应用
- js每日一题(10)
- The e200z4 MMU 学习笔记
- STM32之usart
热门文章
- 【云栖大会】阿里巴巴五大平台联合发布创业扶持计划 大生态力量助力创新创业...
- Flash动画软件的心得笔记
- c#四种线程安全的懒加载单例模式(Lazy、静态内部类、CAS、双重校验)
- 浅谈KNN算法原理及python程序简单实现、KD树、球树
- Unity接入Google广告(AdMob)
- vulnhub VulnOS: 2
- Hyperledger技术简介
- 【学习笔记】LSTM 李弘毅
- 【CCTC 2017】云计算核心技术与实践专场:剖析云计算关键技术,探寻金融、气象行业转型升级之路...
- Java 反射 - 指南