java putifabsent_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));

//未删除成功,输出a

map.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));

//未替换成功,输出c

map.replace(1,"a","z");

System.out.println(map.get(1));

//替换成功,输出z/**

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

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

*/

// 输出旧的值, a

System.out.println(map.replace(1, "aa"));

// 替换成功,输出新的值, aa

System.out.println(map.get(1));

// 不存在key为4, 输出 null

System.out.println(map.replace(4, "d"));

// 不存在key为4, 输出 null

System.out.println(map.get(4));/**

* 8.computeIfAbsent 方法

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

*/

map.computeIfAbsent(1, key -> key + " computed");

// 存在key为1,则不进行计算,输出值 a

System.out.println(map.get(1));

map.computeIfAbsent(4, key -> key + " computed");

// 不存在key为4,则进行计算,输出值 4 computed

System.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计算新的值,输出 2a

System.out.println(map.get(1));

map.computeIfPresent(2, (key, value) -> null);

// 存在key为2, 根据旧的key和value计算得到null,删除该值,输出 null

System.out.println(map.get(2));

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值