在遍历某个list并存放至HashMap中时,一般写法是先判断某个key是否已经存在,再根据情况存入数,经常会把代码写的较复杂,如下:
- 要求 遍历数组nums[],将每个数组出现次数存放至HashMap中
- 代码
int[] nums = {1,2,3,4,4,5,5,1,1,1};
HashMap<Integer,Integer> map = new HashMap<>();
for (int x : nums) {
if (map.containsKey(x)) { //若已存在key,则加1
map.put(x,map.get(x)+1);
}
else {
map.put(x,1); //如key不存在,初始化为1
}
}
下面提供一种比较简单直观的写法
int[] nums = {1,2,3,4,4,5,5,1,1,1};
HashMap<Integer,Integer> map = new HashMap<>();
final int Default = 0;
for (int x : nums) {
map.put(x,map.getOrDefault(x,Default)+1);
}
这里使用了HashMap的getOrDefault方法,它的源码是这样的
public V getOrDefault(Object key, V defaultValue) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
}
首先返回值是一个V类型,即返回的是value,方法需要传入两个参数,分别是key和defaultValue,使用了三目运算符?:来判断,如果该HashMap中没有该Key对应的节点,则返回defaultValue,如果有,则返回该key对应的value
所以map.put(x,map.getOrDefault(x,Default)+1);
这一行代码的意思就是
- 如果x对应的key已经存在,则执行map.put(x,map.get(x)+1)
- 如果x对应的key不存在,则执行map.put(x,Default+1),其中Default初始值我们在外面定义为0