直接上源码
default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}
return v;
}
源码中传入key和value,根据key获取看是否存在value,如果value==null,然后调用put方法把传入的key和value put进map,返回根据key获取的老value
意思就是:putIfAbsent 如果传入key对应的value已经存在,就返回存在的value,不进行替换。如果不存在,就添加key和value,返回null
注意内部实现是调用的put,putIfAbsent和put的区别,put不管什么直接存入,返回旧值,putIfAbsent如果为null才存入,返回旧值。
下面列出一种我认为特别好的使用:处理重复数据与不重复数据,以重复数据为唯一,合并数据的方法。
直接实例:一个班级列表 list<class> classes,一个班级对象实体类class,里面是list<student> students列表
现在传入记录 list<data> datas
学生 班级
张三 1
李四 1
王五 2
赵六 1
孙七 2
周八 1
吴九 2
如何把上面这些记录保存进classes,即相同班级下面,是一个列表,2班 {王五,孙七,吴九}
Map<String, List<student>> map=new HashMap<String,List<student>>();
List<student> students;
for(data data:datas){
students= map.putIfAbsent(data.getClass(),new ArrayList<student>(datas.size()));
if (null == students) {
students= map.get(data.getClass();)
}
student student = new student();
student.setStudent(data.getStudent());
students.add(student);
}
主要看for循环内
第一次循环,map这个key没有保存,value为null,putIfAbsent所以保存获取的class返回null给students,接着为null根据key获取新建的学生列表集合,然后添加学生
第二次,遇到这个key里面存在数据,返回原来的list,所以不进if判断,继续添加新数据到这个list。
(注意:List<student> students;
与students = map.putIfAbsent(data.getClass(),new ArrayList<student>(datas.size()));
每次新建的时候students都指向新的,所以出现不同的班级的时候,这个学生list都是各个班级自己的list,然后添加本班学生就行了。)
保存后就是,将一个列表classes里面的每个class对象都保存着一个class属性,跟一个学生列表。就是把同一个班级的学生合并到了一起。