java中常用的Map类型

概述

Map类型指的是映射类型,用于存放键值对。键就像id一样不可重复,但值是可以出现重复的。例如员工id可以映射到一个具体的员工属性类型。

本文主要讲述HashMap和TreeMap类,以及其核心内容。

HashMap

HashMap是散列映射,因此可以快速的查询键值对的存在性。

我们可以使用put(key,value)方法将一个键值对加入Map集合,如果键已存在,将会对值进行覆盖修改。

我们可以使用get(key)方法,通过键获取这个键值对中的值。

还有一种好用的方法,getOrDefault(key,value)方法可以获取这个键的值,如果键不存在则返回value。

TreeMap

TreeMap是记录顺序的,通过建立一个搜索树来实现对入集顺序的记录,遍历时将会按照put的顺序来输出每个键值对。

更新映射条目

我们可能常常要用映射来记录键key出现的次数value,由于put可以很好的覆盖原有的值,因此我们可以很容易想到下面一种方式来使计数器加1:

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

但是这里有一个问题,就是如果这个值是第一次出现怎么办,无法使用get获取原值,因此我们有一个简单的补救方法,使用getOrDefault方法:

counts.put(word, counts.getOrDefault(word, 0) + 1);

另一种方法是使用putIfAbsent(key, value),只有当key不存在时,才把这个键值对放入Map:

counts.putIfAbsent(word, 0);

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

 不过还可以做得更好,merge(key,value,method)方法可以简化这个操作,如果key不存在,就会将key/value放入Map,如果key存在,则将会根据method方法将原值与value进行操作并更新值:

counts.merge(word, 1, Integer::sum);

映射视图

在java入门书籍中,会将以下内容概述为,Map类的3种遍历方法。本文将会深入一步讲解这些遍历方法相关的机制。

集合框架并不认为映射(Map类)是一个集合,不过,可以得到映射的视图——实现了Collection接口或某个子接口的对象:键集、值集合、键值对集。对应以下方法:

Set<K> keySet()

Collection<V> values()

Set<Map.Entry<K,V>> entrySet()

视图的概念笔者认为,就是指的是在操作上有一些限制,有的可能不能添加,有的可能不能修改,有的可能可以修改但不能改变原集合的长度。

在这里,需要知道的是,如果在键集上调用迭代器方法,可以使用remove方法删除键和对应的值,但是不能调用add方法添加一个键值对,会抛出UnSupportedOperationException异常。

下面给出两个遍历Map类的例子:

Set<String> keys = map.keySet();
for(String key : keys){
    //do something with key
}
for(Map.Entry<String, Employee> entry : staff.enrtySet()){
    String key = entry.getKey();
    Employee value = entry.getValue();
    //do something with key,value
}

经验总结

还有一种比较常见的集合叫HashTable,这个集合实现了Map接口,它和HashMap是亲兄弟,它的方法都是线程安全的,因此它会消耗一定的代价去做同步,这在只有一个线程访问Map类时是完全没有必要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值