Les deux entrées font référence à la même entrée logique de votre carte (dont la clé est "A" et la valeur "B"). Cependant, ils ne sont pas la même instance.
Si vous creusez assez profond dans la mise en œuvre de Collections.unmodifiableMap(map)
vous verrez que sur le itérer entrySet
de la carte retournée par Collections.unmodifiableMap(map)
retourne une nouvelle Map.Entry
qui enveloppe l'entrée modifiable d'origine:
public Map.Entry<K,V> next() {
return new UnmodifiableEntry<>(i.next());
}
Je suis En supposant qu'une nouvelle instance Map.Entry
est également créée lorsque vous appelez set.stream().findFirst().get()
, les deux méthodes renvoient des instances différentes.
Même si vous appelez la même méthode deux fois, vous obtiendrez des cas de différence, à savoir le code suivant également imprimer false
:
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.iterator().next();
System.out.println(entry1 == entry2);
D'autre part, si vous obtenez directement l'entrée de la d'origine HashMap
, vous obtiendrez 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);
Si ce cas l'entrée est enveloppé par une nouvelle instance, donc à la fois entrySet().iterator().next()
et entrySet().stream().findFirst().get()
retourner les s ame exemple.
Non, ils ne devraient pas, puisque l'entrySet d'un HashMap n'a aucun ordre. –
@ JBNizet-- D'accord, mais j'ai seulement 1 élément dans ma carte Monsieur. –
Les cartes ne garantissent pas non plus qu'elles ne créent pas de nouvelles instances Map.Entry à la volée. Ne comparez pas les objets avec ==. Utilisez égal(). –