据我了解,以下代码应该打印 true
,因为 Stream
和 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);
造成这种不同行为的原因可能是什么?
最佳答案
这两个条目都指向 Map 的同一个逻辑条目(其键为“A”,值为“B”)。但是,它们不是同一个实例。
如果您在 Collections.unmodifiableMap(map)
的实现中深入挖掘,您将看到迭代 Collections 返回的 map 的
返回一个新的 entrySet
.unmodifiableMap(map)Map.Entry
包装原始可修改条目:
public Map.Entry<K,V> next() {
return new UnmodifiableEntry<>(i.next());
}
我假设当您调用 set.stream().findFirst().get()
时也会创建一个新实例 Map.Entry
实例,所以两种方法返回不同的实例。
即使你调用同一个方法两次你也会得到不同的实例,即下面的代码也会打印 false
:
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.iterator().next();
System.out.println(entry1 == entry2);
另一方面,如果直接从原始HashMap
中获取entry,则会得到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()
和 entrySet ().stream().findFirst( ).get()
返回相同的实例。
关于java - 流与。 Map 的 entrySet 中的迭代器 - Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44691577/