集允许快速查找现有元素,但查找一个元素需要有准确地址,而映射提供了查找元素相关联的元素,映射(map)存放键值对
映射基本操作
Java库中为映射提供了两个通用实现:HashMap和TreeMap,两个类都实现了Map接口。
散列映射对键进行散列,树映射根据键的顺序将它们组织为一个搜索树,两者选择的依据在于,散列更快一些,如果不需要按照有序顺序访问键,最好选择散列映射。
示例:建立散列映射存储员工信息
var staff = new HashMap<String,Employee>();
var harry = new Employee("Harry Hacker");
staff put("987-98-9996",harry);
如程序所示,每向映射中添加一个对象时,必须同时提供一个键。
获取一个对象时需要使用键,例如:
var id = "987-98-9996";
Employee e = staff.get(id);
如果映射中没有存储与键对应的值,则get方法返回null,也可以使用getOrDwfault方法
var id = "987-98-9996";
Employee e = staff.getOrDefault(id,0);//不存在键值时返回0
键是唯一的,不能对同一个键存放两个值,若对同一个键调用两次put方法,则第二个值会取代第一个值,实际上,put将返回与这个键参数关联的上一个值。
remove方法从映射中删除给定键对应的元素,size方法返回映射中的元素数。
迭代处理映射中的键和值,最容易方法是使用forEach方法,如下
scores.forEach((k,v) -> System.out.println("key="+k+",value="+v))//使用了lambda表达式
示例程序:映射的具体用法,首先将键值对添加进入映射,然后从映射中删除一个键,对应的元素也会删除,接下来修改某个键相关的值,并用get方法查找一个值,最后迭代处理元素集。
API:
1、java.util.Map<K, V> 1.2
V get(Object key)---获得与键关联的值
;
返回与键关联的对象
,
或者如果在映射中没有找到这个键
,则返 回
null
。
实现类可能禁止键为
null
。
default V getOrDefault(Object
key,
V defaultvalue)---获得与键关联的值
;
返回与键关联的对象
,
或者如果在映射中没有找到这个键
,则返回
defaultvalue
V put(K key,
V value) 将关联的一对键和值放到映射中
。
如果这个键已经存在
,新对象将取代之前与这个键 关联的对象
。
这个方法将返回键对应的旧值
。
如果之前没有这个键
,
则返回
null
。实 现类可能禁止键或值为
null
void putAll(Map<? extends
K,
?
extends
V>
entries)---将指定映射中的所有映射条目添加到这个映射中
。
boolean containsKey(Object key)---如果映射中有这个键
,
返回
true
。
boolean containsValue(Object value)---如果映射中有这个值
,
返回
true
。
default void forEach(BiConsumer<?
super
K,?
super
V> action)---对
这个映
射中的所有键
/
值对应用这个
动作
。
更新映射条目
处理映射的一个难点是更新映射
条目
。
正常情况下
,
可以
得到与一个键关联的旧值
,更
新这
个值
,
再放回更新后的值
。
不过
,
必须考虑一个特殊情况
,
即键第一次出现
。
映射视图
集合框架不认为映射本身
是一个
集合
。
(其他数据结构框架
则认为映射是一个键
/
值对集
合
,
或者是按键索引的值集
合
。
)
不过
,
可以得到映射的视图
(view)
—
—
实现了
Collection接
口或某个子接口的对象。
有3
种视图
:
键集
、
值集合(不
是一
个集)以及键
/
值对集
。
键和键
/
值对可以构成一个
集
,
因为映射中一个键只能有一个副本
。
3种方法:
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()分别返回这3个视图,(映射条目集的元素是实现了
Map.Entry
接口的类的对象
。
)
注意:keySet不是HashSet或TreeSet,而是实现了Set接口的另外某个类的对象,Set接口扩展了Collection接口,因此可以像使用任何集合一样使用keySet。