Map中经常被忽略但又非常好用的方法

打印 上一主题 下一主题

主题 923|帖子 923|积分 2769

1. 简介

map是我们日常开发中常会的聚集类之一, 但是我们除了常用的get和put之外,其他的方法好像很少会用到,接下来我们就介绍一下几个经常被忽略但又很好用的方法.
2. Quick Start

2.1 数据准备

创建一个map对象, 并声明几个用于测试的user对象
  1. Map<Integer, User> hashMap = Maps.newHashMap();
  2. User zhangsan = new User(1, "张三");
  3. User lisi = new User(2, "李四");
  4. User zhangtieniu = new User(3, "张铁牛");
复制代码
2.2 重温put
  1. // hashmap put (添加/更新元素)
  2. @Test
  3. public void put() {
  4.     User test = hashMap.put(null, null);
  5.     User user = hashMap.put(1, null);
  6.     User user1 = hashMap.put(1, zhangsan);
  7.     User user2 = hashMap.put(1, lisi);
  8.     User user3 = hashMap.put(null, zhangsan);
  9.     User user4 = hashMap.put(null, lisi);
  10.     User user5 = hashMap.get(null);
  11.     log.info("map: {}", hashMap);
  12.     log.info("user: {}, user1: {}, user2: {}, user3: {}, user4: {}, user5: {}", user, user1, user2, user3, user4, user5);
  13.     //map: {null=User(id=2, name=李四), 1=User(id=2, name=李四)}
  14.     //user: null, user1: null, user2: User(id=1, name=张三), user3: null, user4: User(id=1, name=张三), user5: User(id=2, name=李四)
  15. }
复制代码

  • key和value可以为null (hashmap 和 linkedhashmap)
  • 利用null可以正常的覆盖和获取元素
  • put可以直接新增or覆盖已有的元素
  • put方法返回对应key的oldValue,如果没有oldValue则返回null
2.3 getOrDefault
  1. // getOrDefault(Object key, V defaultValue) (获取/返回默认值)
  2. @Test
  3. public void getOrDefault() {
  4.     hashMap.put(1, zhangsan);
  5.     hashMap.put(2, null);
  6.     final User user1 = hashMap.get(1);
  7.     final User user2 = hashMap.getOrDefault(2, lisi);
  8.     final User user3 = hashMap.getOrDefault(3, zhangtieniu);
  9.     log.info("map: {}", hashMap);
  10.     //map: {1=User(id=1, name=张三), 2=null}
  11.     log.info("user1: {}, user2: {}, user3: {}", user1, user2, user3);
  12.     //user1: User(id=1, name=张三), user2: null, user3: User(id=3, name=张铁牛)
  13. }
复制代码

  • 当map中没有对应的key时, 返回对应的defaultValue
    留意: 如果map中存在对应的key, 但是对应的value == null时, 返回的是null, 而不是defaultValue
源码如下:
  1. default V getOrDefault(Object key, V defaultValue) {
  2.     V v;
  3.     return (((v = get(key)) != null) || containsKey(key))
  4.         ? v
  5.         : defaultValue;
  6. }
复制代码
2.4 putIfAbsent
  1. // putIfAbsent(K key, V value) (如果不存在则添加)
  2. @Test
  3. public void putIfAbsent() {
  4.     hashMap.put(1, null);
  5.     User user1 = hashMap.putIfAbsent(1, zhangsan);
  6.     User user2 = hashMap.putIfAbsent(2, lisi);
  7.     User user3 = hashMap.putIfAbsent(2, zhangtieniu);
  8.     log.info("map: {}", hashMap);
  9.     log.info("user1: {}, user2: {}, user3: {}", user1, user2, user3);
  10.     //map: {1=User(id=1, name=张三), 2=User(id=2, name=李四)}
  11.     //user1: null, user2: null, user3: User(id=2, name=李四)
  12. }
复制代码

  • 如果指定的key对应的value不为null时(oldValue != null) : 不覆盖 & 返回oldValue
  • 当指定key的value不存在时(oldValue == null) : 添加元素 & 返回oldValue
可以理解为 当指定key的value不存在时, 才去put, 否则不添加
源码如下:
  1. default V putIfAbsent(K key, V value) {
  2.     V v = get(key);
  3.     if (v == null) {
  4.         v = put(key, value);
  5.     }
  6.     return v;
  7. }
复制代码
2.5 compute

[code]// compute(K key, BiFunction
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表