map的put和putIfAbsent使用

直接上源码

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

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值