2010-11-02 16 views
16

Todo,Igualdad entre 2 HashMap

En el método equals() de mi clase, estoy usando una variable de instancia privada HashMap para comparar la igualdad. Sin embargo, 2 objetos diferentes todavía muestran ser iguales al comparar sus variables HashMap. Investigaciones adicionales me llevaron al enlace: Link Here. Sin embargo, solo dice que el motivo por el que HashMap1.equals (HashMap2) no funciona es porque "aparentemente las matrices de Java no se pueden probar para determinar la igualdad sin escribir un código personalizado".

No entendí esta razón. ¿Alguien puede por favor guiarme a una razón elaborada?

Respuesta

21

El método equals en un tipo de matriz Java es equivalente a ==, porque las "clases" de matriz Java no anulan Object.equals.

Si desea comparar matrices "por valor", debe utilizar el método java.util.Arrays.equals(...) adecuado o implementarlo usted mismo.

Si su HashHap utiliza matrices como claves o valores, esto haría que HashMap.equals se comporte de manera extraña (desde su perspectiva). Eso es lo que dice el artículo vinculado. Sin embargo, la matriz semántica solo afecta a HashMap igualdad si utiliza matrices como (o en) la clave o clases de valor. Si no lo hace, entonces equals debería funcionar como se espera.

(Los javadocs para la igualdad de Map clases son un poco involucrados, pero básicamente se reducen a tomar los dos conjuntos de entrada, comparando sus tamaños, y luego hacer s1.containsAll(s2). Por supuesto, esto es caro, pero deberían hacerlo funciona para todas las clases Map que implementan correctamente la interfaz Map.)

3

Las matrices nativas de Java no tienen una función .equals(). Entonces, si los valores de su hashmap (o claves, supongo) son matrices, HashMap.equals() fallará. Sospecho que recaería en Object.equals() que solo verifica si los dos objetos son realmente el mismo objeto.

// something like this 
class Object { 
    public boolean equals(Object o) { 
    return this == o; 
    } 
} 

Puede eludir el problema mediante el uso de alguna variante sobre un recipiente en lugar de una matriz [], como contenedores tienen sus propios .equals() que llama equals() en elementos sucesivos de los recipientes en lugar de simplemente la comprobación si son la misma referencia. El código para una aplicación Collection.equals podría ser algo como:

public boolean equals(Object o) { 
    // sets never equal lists and visa versa 
    if (o instanceof MyCollectionSubclass) { 
    Iterator myIterator = iterator(); 
    Iterator theirIterator = ((Collection)o).iterator(); 
    while (myIterator.hasNext() && theirIterator.hasNext()) { 
     Object myObj = myIterator.next(); 
     Object theirObj = theirIterator.next(); 
     if (!myObj.equals(theirObj)) { 
     return false; 
     } 
    } 
    // at least one will be false or we wouldn't have left the above while loop 
    return myIterator.hasNext() == theirIterator.hasNext(); 
    } 
    // not our class 
    return false; 
} 

Esto podría producir una verdadera comparación de valores en función de lo que los contenidos de la colección hacer cuando llame a su equals().

+1

Las matrices heredan de Object y tienen la misma implementación que Object. –

+0

Eso es lo que pensé, aunque no me molesté en buscarlo. –

6

El artículo es correcto. Los Hashmaps se pueden comparar de forma segura utilizando el método equals(), siempre que los objetos clave y los objetos de valor se puedan comparar utilizando el mismo método. En el artículo, los valores del mapa son matrices, que no implementan equals() como se esperaba. El uso de ArrayList en su lugar habría resuelto el problema.

2

matrices de Java no pueden ser probados por la igualdad sin escribir un código personalizado

Ésta es sólo una manera complicada de decir que las matrices de Java no anulan Object.equals().Por lo tanto, si los compara utilizando equals() (que es lo que hacen los métodos equals de todas las clases de colección), obtiene "igualdad de instancia", en lugar de "igualdad de valor".

Eso es realmente solo un caso especial de las diferentes formas en que equals funciona dependiendo de si ha sido anulado o no.

Cuestiones relacionadas