Java的Map介绍以及常见方法和三种遍历方式
1 Java 中的 Map 介绍
在 Java 中,Map
是一个接口,它提供了一种存储键值对(key-value pairs)的方式。每个键(key)都关联着一个值(value),并且在一个 Map
中,键是唯一的,但值可以重复。Map
接口不继承自 Collection
接口,因此它与 List
、Set
等集合类不同,属于双列集合。
1.1 Map 的特点
- 键值对存储:
Map
存储的是键值对,其中键用于唯一标识一个条目,而值则是该条目的具体内容。 - 键的唯一性:同一个
Map
中不能存在两个相同的键,但如果两个键相等(根据equals
方法判断),则后插入的键值对会覆盖之前的键值对。 - 值的可重复性:虽然键必须唯一,但值可以重复。
- 无序性:大多数
Map
实现并不保证元素的顺序,除非使用了如LinkedHashMap
这样的特定实现。
1. 2 常见的 Map 实现
HashMap
:基于哈希表实现,提供了快速的查找、插入和删除操作,但不保证元素的顺序。允许null
键和null
值。TreeMap
:基于红黑树实现,能够对键进行自然排序或通过指定的比较器排序。不允许null
键,但允许null
值。LinkedHashMap
:结合了HashMap
和链表的优点,既保持了插入顺序,又提供了高效的查找性能。Hashtable
:类似于HashMap
,但它线程安全,不允许null
键和null
值。由于其同步特性,性能通常低于HashMap
。
2 Map 的常见方法
Map
接口定义了一系列常用的方法来操作键值对,以下是其中一些重要的方法,并附带示例代码:
2.1 添加/更新
put(K key, V value)
:将指定的键值对添加到Map
中,如果键已存在,则更新其对应的值,并返回旧值;如果键不存在,则返回null
。void putAll(Map<? extends K, ? extends V> m)
:将另一个Map
中的所有键值对复制到当前Map
中。
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25); // 添加键值对
System.out.println(map.put("Alice", 30)); // 更新键值对,返回旧值 25
Map<String, Integer> anotherMap = new HashMap<>();
anotherMap.put("Bob", 30);
anotherMap.put("Charlie", 35);
map.putAll(anotherMap); // 将 anotherMap 的所有键值对复制到 map 中
System.out.println(map); // 输出: {Alice=30, Bob=30, Charlie=35}
2.2 删除
remove(Object key)
:根据指定的键删除相应的键值对,并返回被删除的值;如果键不存在,则返回null
。void clear()
:清空Map
中的所有键值对。
System.out.println(map.remove("Alice")); // 删除键 "Alice",返回值 30
map.clear(); // 清空 map
System.out.println(map); // 输出: {}
2.3 获取
get(Object key)
:根据指定的键获取对应的值;如果键不存在,则返回null
。boolean containsKey(Object key)
:检查Map
是否包含指定的键。boolean containsValue(Object value)
:检查Map
是否包含指定的值。
map.put("Alice", 25);
map.put("Bob", 30);
System.out.println(map.get("Alice")); // 获取键 "Alice" 对应的值,输出 25
System.out.println(map.containsKey("Alice")); // 检查是否包含键 "Alice",输出 true
System.out.println(map.containsValue(30)); // 检查是否包含值 30,输出 true
2.4 查询
int size()
:返回Map
中键值对的数量。boolean isEmpty()
:判断Map
是否为空。
System.out.println(map.size()); // 输出 2
System.out.println(map.isEmpty()); // 输出 false
map.clear();
System.out.println(map.isEmpty()); // 输出 true
3 Map 的三种遍历方式
遍历 Map
是指访问 Map
中所有的键值对。Java 提供了多种遍历 Map
的方法,以下是三种常见的遍历方式,并附带示例代码:
3.1 使用 entrySet()
遍历
这是最推荐的方式,因为它效率最高,可以直接访问键和值,避免了多次调用 get()
方法带来的性能开销。entrySet()
返回的是一个包含所有键值对的 Set
,每个元素都是一个 Map.Entry
对象,可以通过 getKey()
和 getValue()
方法分别获取键和值。
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
这种方式不仅代码简洁,而且性能优越,因为它是直接访问键值对,而不是通过键来查找值。
3.2 使用 keySet()
遍历
keySet()
返回的是一个包含所有键的 Set
,然后可以通过 get()
方法根据键来获取对应的值。这种方法适用于只需要遍历键的情况,但如果需要同时访问键和值,则效率较低,因为每次都需要调用 get()
方法来获取值。
for (String key : map.keySet()) {System.out.println("Key: " + key + ", Value: " + map.get(key));
}
尽管这种遍历方式在某些情况下可能是必要的,但它通常不如 entrySet()
方式高效。
3.3 使用 values()
遍历
values()
返回的是一个包含所有值的 Collection
,适用于只需要遍历值的情况。然而,这种方法无法直接访问键,因此在需要同时访问键和值时并不适用。
for (Integer value : map.values()) {System.out.println("Value: " + value);
}
这种方式适合于只需要处理值的场景,但如果需要访问键,则不适合使用。
总结
Map
是 Java 中非常重要的数据结构之一,广泛应用于各种应用场景中。了解 Map
的基本概念、常见方法以及如何高效地遍历 Map
,对于编写高质量的 Java 程序至关重要。通过选择合适的 Map
实现和遍历方式,可以显著提高代码的性能和可读性。在实际开发中,应根据具体需求选择最适合的 Map
实现,并采用最合适的遍历方式来优化程序性能。