两个条目都引用映射的相同逻辑条目(其键是“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()
返回相同的实例。