• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

map的put和putIfAbsent使用

java 来源:Mint6 2次浏览

直接上源码

  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属性,跟一个学生列表。就是把同一个班级的学生合并到了一起。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)