使用keySet遍历
- 代码示例:
import java.util.HashMap;
import java.util.Map;
public class MapTraversal {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
for (String key : map.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
}
}
- 性能表现:每次通过
map.get(key)
获取值时,会进行一次哈希查找,对于大数据量的Map
,性能相对较低。因为每次获取值都需要额外的查找操作。
- 适用场景:当只需要操作
Map
中的键,而不需要频繁获取对应的值时适用。例如,统计键的某些特性,而不关心值具体是什么。
使用entrySet遍历
- 代码示例:
import java.util.HashMap;
import java.util.Map;
public class MapTraversal {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
- 性能表现:直接获取键值对,不需要额外的查找操作,性能较好。因为在遍历过程中,键值对已经在
Entry
对象中封装好了。
- 适用场景:当需要同时操作键和值时,这种方式是最佳选择。例如,对键值对进行一些转换或同时更新键和值的场景。
使用values遍历
- 代码示例:
import java.util.HashMap;
import java.util.Map;
public class MapTraversal {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
for (Integer value : map.values()) {
System.out.println("Value: " + value);
}
}
}
- 性能表现:直接遍历值,性能较好。因为只关注值,不需要处理键相关的操作。
- 适用场景:当只需要操作
Map
中的值,而不关心键时适用。例如,对所有值进行求和、求平均值等操作。
使用迭代器遍历
- 使用keySet的迭代器:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapTraversal {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
Iterator<String> keyIterator = map.keySet().iterator();
while (keyIterator.hasNext()) {
String key = keyIterator.next();
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
}
}
- 使用entrySet的迭代器:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapTraversal {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
Iterator<Map.Entry<String, Integer>> entryIterator = map.entrySet().iterator();
while (entryIterator.hasNext()) {
Map.Entry<String, Integer> entry = entryIterator.next();
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
- 性能表现:与对应的
keySet
和entrySet
遍历方式类似。使用迭代器的优势在于可以在遍历过程中安全地删除元素。在for - each
循环中删除元素会抛出ConcurrentModificationException
,而使用迭代器的remove
方法可以避免。
- 适用场景:当需要在遍历过程中删除元素时适用。例如,在遍历
Map
时,根据某些条件删除特定的键值对。