Java Map的遍历方式

268 阅读1分钟

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);
    }
}