【Java】散列映射(HashMap)七条必备知识点

1、若映射中没有存储与给定键对应的信息,get方法会返回null
如果希望返回你设定的默认值,使用getOrDefault方法。

//situation 1
var id = "00000000";
Employee e = staff.get(id);
//如果id不存在,不会报错,e == null

//situation 2
int score = scores.getOrDefault(id, 0);
//如果id不存在,score == 0

2、put方法有返回值,它会返回与这个键相关联的上一个值。

var sores = new HashMap<String, Integer>();
scores.put("Bob", 99);
int old = scores.put("Bob", 100);
//old == 99

3、迭代处理映射中的键与值

  1. 使用 forEach + lambda表达式
scores.forEach((k, v) ->
   {
      ...
   }
);
  1. 使用entrySet
for(var entry : scores.entrySet())
{
   System.out.println("key = " + entry.getKey());
   System.out.println("value = " + entry.getValue());
}

4、remove(key)方法会删除一个键值对。

5、HashMap具有三个构造器,允许设置初始容量与装填因子(默认为0.75),一旦装填因子超过设置值,会再散列至一个更大的散列表中。

6、试想你需要通过映射统计一个单词在文件中出现的频度。
这样写是错误的

counts.put(word, counts.get(word) + 1);

因为当第一次出现一个单词时,get函数返回null,因此会爆发NullPointerException异常。
以下有三种改写方式:

//Method 1
counts.put(word,counts.getOrDefault(word, 0) + 1);
//Method 2
counts.putIfAbsent(word, 0);
count.put(word, counts.get(word) + 1);
//Method 3
counts.merge(word, 1, Integer::sum);

merge方法的作用原理如下:
若key(word)相关联的值不是null,则将函数(Integer::sum)应用到原先相关联的值与函数中的数值(1),若结果非null,将key与结果相关联;若结果为null,将键删除。
若key原先没有关联值,将key与函数中的数值相关联。
这样就可以快速更新映射条目了。

7、映射视图

// 键集:
Set<String> keys = staff.keySet();
for(String key : keys)
{
   ...
}
//值集合:
for(Empolyee employee : staff.values())
{
   ...
}
//键值对集:
for(Map.Entry<String, Employee> entry : staff.entrySet())
//或写成 var entry : staff.entrySet()
{
   String k = entry.getKey();
   Employee v = entry.getValue();
   ...
}

注意

  1. 映射视图(键集、值集合、键值对集)都是实现了Collection接口或者某个子接口的对象。
  2. 键值对集中的元素(entry)是实现了Map.Entry接口的类的对象。
  3. keySet既不是HashSet也不是TreeSet,而是另外某个实现了Set接口的类的对象。由于Set接口扩展于Collection接口,因此keySet可以像任何集合一样使用。
  4. 对keySet中的元素调用remove方法会从映射中删除键和与之相联的值。
  5. 禁止向键集视图或键值对集中添加元素,试图调用add方法会爆发UnsupportedOperationException异常。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值