這兩個條目都指的是您的Map的相同邏輯條目(其關鍵字爲「A」,值爲「B」)。但是,它們不是同一個實例。
如果您在Collections.unmodifiableMap(map)
實施深挖的話,你會看到,在迭代通過Collections.unmodifiableMap(map)
返回地圖的entrySet
返回一個新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
,你會得到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()
返回的S一個例子。
不,他們不應該,因爲HashMap的entrySet沒有排序。 –
@ JBNizet--同意,但我的地圖中只有1個元素。 –
地圖也不保證它們不會即時創建新的Map.Entry實例。不要用==比較對象。使用equals()。 –