流Vs。 Map 的 EntrySet 中的迭代器 - Java 8

2024-04-09

据我了解,以下代码应该打印true,因为两者Stream and Iterator指向第一个元素。

但是,当我运行以下代码时,它正在打印false:

final HashMap<String, String> map = new HashMap<>();
map.put("A", "B");
final Set<Map.Entry<String, String>> set = Collections.unmodifiableMap(map).entrySet();
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.stream().findFirst().get();
System.out.println(entry1 == entry2);

这种不同行为的原因可能是什么?


两个条目都引用映射的相同逻辑条目(其键是“A”,值是“B”)。然而,它们不是同一个实例。

如果你在实施中挖掘得足够深Collections.unmodifiableMap(map)你会看到迭代entrySet返回的地图的Collections.unmodifiableMap(map)返回一个新的Map.Entry它包装了原始的可修改条目:

public Map.Entry<K,V> next() {
  return new UnmodifiableEntry<>(i.next());
}

我假设一个新实例Map.Entry当您调用时也会创建实例set.stream().findFirst().get(),因此这两个方法返回不同的实例。

即使您调用相同的方法两次,您也会得到不同的实例,即以下代码也会打印false:

Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.iterator().next();
System.out.println(entry1 == entry2);

另一方面,如果您直接从原始版本获取条目HashMap, 你会得到true:

Map.Entry<String, String> entry1 = map.entrySet ().iterator().next();
Map.Entry<String, String> entry2 = map.entrySet ().stream().findFirst().get();
System.out.println (entry1==entry2);

如果在这种情况下,条目没有被新实例包装,那么两者entrySet ().iterator().next() and entrySet ().stream().findFirst().get()返回相同的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流Vs。 Map 的 EntrySet 中的迭代器 - Java 8 的相关文章

随机推荐