1. 简介
map是我们日常开发中常会的聚集类之一, 但是我们除了常用的get和put之外,其他的方法好像很少会用到,接下来我们就介绍一下几个经常被忽略但又很好用的方法.
2. Quick Start
2.1 数据准备
创建一个map对象, 并声明几个用于测试的user对象- Map<Integer, User> hashMap = Maps.newHashMap();
- User zhangsan = new User(1, "张三");
- User lisi = new User(2, "李四");
- User zhangtieniu = new User(3, "张铁牛");
复制代码 2.2 重温put
- // hashmap put (添加/更新元素)
- @Test
- public void put() {
- User test = hashMap.put(null, null);
- User user = hashMap.put(1, null);
- User user1 = hashMap.put(1, zhangsan);
- User user2 = hashMap.put(1, lisi);
- User user3 = hashMap.put(null, zhangsan);
- User user4 = hashMap.put(null, lisi);
- User user5 = hashMap.get(null);
- log.info("map: {}", hashMap);
- log.info("user: {}, user1: {}, user2: {}, user3: {}, user4: {}, user5: {}", user, user1, user2, user3, user4, user5);
- //map: {null=User(id=2, name=李四), 1=User(id=2, name=李四)}
- //user: null, user1: null, user2: User(id=1, name=张三), user3: null, user4: User(id=1, name=张三), user5: User(id=2, name=李四)
- }
复制代码
- key和value可以为null (hashmap 和 linkedhashmap)
- 利用null可以正常的覆盖和获取元素
- put可以直接新增or覆盖已有的元素
- put方法返回对应key的oldValue,如果没有oldValue则返回null
2.3 getOrDefault
- // getOrDefault(Object key, V defaultValue) (获取/返回默认值)
- @Test
- public void getOrDefault() {
- hashMap.put(1, zhangsan);
- hashMap.put(2, null);
- final User user1 = hashMap.get(1);
- final User user2 = hashMap.getOrDefault(2, lisi);
- final User user3 = hashMap.getOrDefault(3, zhangtieniu);
- log.info("map: {}", hashMap);
- //map: {1=User(id=1, name=张三), 2=null}
- log.info("user1: {}, user2: {}, user3: {}", user1, user2, user3);
- //user1: User(id=1, name=张三), user2: null, user3: User(id=3, name=张铁牛)
- }
复制代码
- 当map中没有对应的key时, 返回对应的defaultValue
留意: 如果map中存在对应的key, 但是对应的value == null时, 返回的是null, 而不是defaultValue
源码如下:- default V getOrDefault(Object key, V defaultValue) {
- V v;
- return (((v = get(key)) != null) || containsKey(key))
- ? v
- : defaultValue;
- }
复制代码 2.4 putIfAbsent
- // putIfAbsent(K key, V value) (如果不存在则添加)
- @Test
- public void putIfAbsent() {
- hashMap.put(1, null);
- User user1 = hashMap.putIfAbsent(1, zhangsan);
- User user2 = hashMap.putIfAbsent(2, lisi);
- User user3 = hashMap.putIfAbsent(2, zhangtieniu);
- log.info("map: {}", hashMap);
- log.info("user1: {}, user2: {}, user3: {}", user1, user2, user3);
- //map: {1=User(id=1, name=张三), 2=User(id=2, name=李四)}
- //user1: null, user2: null, user3: User(id=2, name=李四)
- }
复制代码
- 如果指定的key对应的value不为null时(oldValue != null) : 不覆盖 & 返回oldValue
- 当指定key的value不存在时(oldValue == null) : 添加元素 & 返回oldValue
可以理解为 当指定key的value不存在时, 才去put, 否则不添加
源码如下:- default V putIfAbsent(K key, V value) {
- V v = get(key);
- if (v == null) {
- v = put(key, value);
- }
- return v;
- }
复制代码 2.5 compute
[code]// compute(K key, BiFunction |