Integer i = 2;
String key = "k";
Map<String, Integer> aDict = new HashMap<>();
Map<String, Integer> bDict = new HashMap<>();
aDict.put(key, i);
bDict.put(key, i);
System.out.println(aDict.values().equals(bDict.values()));
Os retornos acima false
— testados em vários tempos de execução. Por que isso acontece?
Comparação de referência versus comparação de valor
Collection.equals
Não requer implementações para comparar os elementos nas coleções. Usar igualdade de referência (ieObject.equals
) para implementarCollection.equals
é completamente válido.Citação do JavaDoc (ênfase minha):
Se o tipo de retorno
HashMap.values()
fosseList
ouSet
, então você poderia esperar que essaequals
comparação retornasse verdadeiro. Mas, na realidade,values()
é declarado para retornar umCollection
.No OpenJDK 22, o tipo concreto que
HashMap.values()
retorna é uma classe interna chamadaValues
, que não substituiObject.equals
, como pode ser visto no código-fonte .Bem, o método values() do HashMap não garante nenhuma ordenação específica de seus elementos da mesma forma que o HashMap<> não garante nenhuma ordenação específica de seus pares chave-valor.
Tente imprimir ambas as funções values() e você verá isso em ação.