简单介绍 Java Map
程序员文章站
2022-04-25 17:40:51
...
简单介绍 Java Map
第一次使用 Java 的 Map,遇到一些坑。所以总结一下。
Map 基本定义
Map 是一种数据容器,采用映射的方式实现键(Key)和值(Value)的关联。
数组也可以认为采用映射的方式,实现数据的键(整数)和值的关联。
比如:
char hello[6] = { 'w', 'o', 'r', 'l', 'd', '\0' };
其中的键是 0, 1, 2, 3, 4, 5
,分别对应的值是字符 'w', 'o', 'r', 'l', 'd', '\0'
。
Map 定义
Java 的 Map 定义如下:
/*
* K 是键(Key)的数据类型
* V 是值(Value)的数据类型
*/
Map<K, V> map = new HashMap<>();
/*
* 如果我想定义 ID(不超过 int 范围的整数)和名字的关系 Map,可以如下定义:
*/
Map<Integer, String> mapId2Name = new HashMap<>();
/*
* 更复杂的,我有多个班级(Group)多个学生(User)的多次测量的身高数据(Feature)。
* 需要用班级ID(Long类型)关联每个班的学生
* 而每个学生ID(Long类型)关联多组身高数据(float类型)
* 可以如下定义:
*/
Map<Long, Map<Long, List<float[]>>> mMapGroupUserFeature = new HashMap<>();
定义上有几点特点(或者说限制):
- 键(Key)的数据类型必须是类(Class),不能用基础数据类型(int、float、char等)定义。值(Value)的数据类型则没有限制。
- 初始化各种类型的 Map,必须用 HashMap 来初始化。
Map 使用
增加
V put(K key, V value);
mapId2Name.put(1068, "ZONE");
注意:使用 put
接口需要自行判断 key 是否已经存在,如果存在执行 put
操作会覆盖数据。
删除
V remove(Object key);
mapId2Name.remove(1068);
清空
void clear();
mapId2Name.clear();
获取
V get(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
// 错误的获取方式
String name = mapId2Name.get(1068);
// 正确的获取方式
String name = null;
if (mapId2Name.containsKey(1068)) {
name = mapId2Name.get(1068);
}
注意:get
接口没有做有效性检查,所以传递的 key 必须是 Map 内存在的。
如果 key 不存在就调用 get
会出错。
需要用 containsKey
判断 key 是否存在于容器中。(containsValue
则是判断 value 是否存在于容器中)
Map 遍历
Map 由于保存了 key 和 value 的映射。
所以遍历方式有 3 种:
- 遍历所有键 key
- 遍历所有值 value
- 遍历所有键值对 entry
这里以遍历键值对 entry 为例。
Map.Entry 键值对操作
通过键值对 entry 获取键 key 和值 value。
K getKey();
V getValue();
// 假设其中一个键值对为 entry
Map.Entry<Long, String> entry = ...;
// 获取键
Long id = entry.getKey();
// 获取值
String name = entry.getValue();
获取键值对集合
Set<Map.Entry<K, V>> entrySet();
Set<Map.Entry<Long, String>> entrySet = mapId2Name.entrySet();
遍历 Map 的方式可以通过遍历 entrySet
Iterator<Map.Entry<Long, String>> iterator = mapId2Name.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Long, String> entry = iterator.next();
// 获取键
entry.getKey();
// 获取值
entry.getValue();
}
注意:
这里的 iterator.next()
除了返回当前迭代器指向的 entry 实体,还会自动移到下一个 entry 实体。
所以如果需要获取 key 和 value,必须先把当前提取出的 entry 保存起来。
其它 Map
Java 中还有其它不同功能的 Map。
待下回分解
上一篇: 问题 E: 项目开发(STL)