map的put和putIfAbsent使用

来源:互联网 发布:mac上看美剧的软件 编辑:程序博客网 时间:2024/05/21 09:39

直接上源码

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