example java collections hashmap

java - example - ¿Por qué AbstractCollection no implementa equals()?



object tostring java (3)

AbstractList y AbstractSet extienden AbstractCollection, y tienen diferentes comportamientos para sus métodos equals (), especificados por las interfaces List y Set . La interfaz para Collection dice:

Mientras que la interfaz de Colección no agrega estipulaciones al contrato general para Object.equals, los programadores que implementan la interfaz de Colección "directamente" (en otras palabras, crean una clase que es una Colección pero no es un Conjunto o una Lista) deben tener cuidado si eligen anular los Object.equals.

Entonces AbstractCollection definitivamente no debe anular equals (). Dicho esto, realmente no sé por qué HashMap $ Values ​​no implementaría equals () en sí mismo.

Sabía usted que :

Map<Object,Object> m1 = new HashMap<Object, Object>(); Map<Object,Object> m2 = new HashMap<Object, Object>(); System.out.println("m1.equals(m2) = "+m1.equals(m2)); System.out.println("m1.keySet().equals(m2.keySet()) = " +m1.keySet().equals(m2.keySet())); System.out.println("m1.entrySet().equals(m2.entrySet()) = " +m1.entrySet().equals(m2.entrySet())); System.out.println("m1.values().equals(m2.values()) = " +m1.values().equals(m2.values()));

saldría:

m1.equals(m2) = true m1.keySet().equals(m2.keySet()) = true m1.entrySet().equals(m2.entrySet()) = true m1.values().equals(m2.values()) = false

Esto se debe al hecho de que AbstractCollection (de lo que HashMap$Values hereda) no anula a #equals() .

¿Tienes una idea de por qué esto es así?


No estoy seguro de si esa es la razón oficial, pero AbstractCollection evita agregar restricciones semánticas a posibles subclases. La semántica de la igualdad está determinada por la naturaleza de la estructura de datos de herencia concreta, y en particular en función de si su estructura está ordenada y si permite duplicados.

Por ejemplo, considere TreeSet, LinkedList, Bag, etc.

Por cierto, en relación con el código que publicaste, ¿cuál es el tipo real de lo que devuelven los valores? Eso debería ser una subclase con una implementación concreta. Si su mapa está vacío cuando ejecuta este código, es posible que termine con algo que no considere que dos conjuntos vacíos sean iguales.


Según el contrato de Collection#equals() , no hay métodos equals () de propósito general para Collection s, y por lo tanto AbstractCollection no puede proporcionar uno.

Tenga en cuenta que HashMap$Values no es un conjunto ni una lista, por lo tanto, el dilema y, en cierto sentido, la razón por la que no admite equals() .