Map的遍历方式
键找值
Map<String, String> map = new HashMap();
- 获取所有的键,将这些键放到一个单列集合中
Set<String> keys = map.keySet();
- 遍历单列集合,得到一个键
- 利用map集合中的键获取对应的值
for (String key : keys) {
String value = map.get(key);
}
键值对
通过键值对对象进行遍历
Map<String, String> map = new HashMap();
- 调用entrySet方法获取所有键值对对象,返回一个set集合
- 在这里有一个泛型的嵌套
- Entry实际上是Map接口中的一个内部接口
Set<Map.Entry<String, String>> entries = map.entrySet();
- 遍历entries集合,依次得到每一个键值对对象
- 利用entry调用get方法获取键和值
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
}
- 更贴近源码的方式
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
}
Lambda表达式
| 方法名称 | 说明 |
|---|---|
| default void forEach(BiConsumer<? super K, ? super V> action) | 结合lambda表达式遍历Map集合 |
Map<String, String> map = new HashMap();
- 匿名内部类
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
sout(key + value)
}
});
- Lambda表达式
map.forEach((String key, String value) -> {
System.out.println(key + value);
}
);
- Lambda表达式简化
map.forEach((key, value) -> System.out.println(key + value));
forEach方法底层原理
- 调用enyrtSet方法获取Entry对象的集合
- 增强for遍历集合获取每个Entry对象
- 通过getKey和geyValue方法获取Entry对象中的键和值
- 调用我们自己定义的accept方法获取键和值
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch (IllegalStateException ise) {
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}