2012-05-26 20 views
5

He estado navegando muchas preguntas similares aquí y en otros sitios. Todavía no puedo entender mi problema.Ignorar el método equals no funciona

tengo una clase:

public class Event { 
    public String Item; 
    public String Title; 
    public String Desc; 

    @Override 
    public boolean equals(Object o) { 
      return true; 
    } 
} 

Estoy tratando de utilizar esta clase en un ArrayList<Event> events pero no puedo encontrar una manera de conseguir events.contains("item") para trabajar. Intenté la depuración y descubrí que ni siquiera ingresa al método reemplazado.

¿Qué estoy haciendo mal?

+2

Su lista contiene 'Event's aún está llamando' contiene' con una cadena. ¿Me estoy perdiendo de algo? – Tudor

+1

Muestra el código donde estás completando la lista y llamando a 'contiene'. – Tudor

Respuesta

7

Esto se debe a que está rompiendo la simetría como specified in the contract de equals(): si cualquier evento es igual a "item" (que es una cadena), "item" también debe ser igual a cualquier evento.

En realidad, lo que Java hace es llamar al indexOf("item") en su lista y comprobar si es positivo.

Ahora, indexOf() obras de este tipo en un ArrayList por ejemplo (véase complete source code here):

for (int i = 0; i < size; i++) 
     if ("item".equals(elementData[i])) 
      return i; 

Así que básicamente es el método String's equals() que se llama aquí, no su ser que se vuelve falsa, por supuesto.

a resolver este problema simplemente especificando un parámetro Event a la función, como:

events.contains(new Event("item", "title", "desc")) 

Tenga en cuenta que tendrá que crear un constructor adecuado para su clase OT inicializar los miembros.

+0

¿Cómo puedo resolver eso entonces? – CornflakesDK

+1

Finalmente una buena respuesta. En aras de la exhaustividad, puede vincular y/o publicar en el código fuente de 'ArrayList.contains': http://www.docjar.com/html/api/java/util/ArrayList.java.html – Tudor

+1

@CornflakesDK: Puedes comenzar por no comparar manzanas con naranjas. Busca en la lista un 'Evento' porque contiene' Evento's. – Tudor

0

También debe omitir public int hashCode(). Los dos métodos están estrechamente relacionados.

Leer más: http://www.javapractices.com/topic/TopicAction.do?Id=17

+1

El OP simplemente está usando una 'ArrayList'. Si bien esta respuesta es cierta, no es útil. –

+1

No, hashCode() no tiene nada que ver con esto. Es porque la simetría está rota. – rlegendi

0

Cuando se reemplaza equals() método, también hay que reemplazar el método hashcode() porque van de la mano. Si dos objetos son iguales, entonces tienen que tener el mismo código hash. Los Hashmaps usan esto para evaluar las ubicaciones guardadas. Si dos objetos no son iguales, pueden o no tener el mismo código hash.

0

En este caso, solo necesita reemplazar método igual, no el método hashCode.

El método hashCode y el método equals deben anularse cuando desee utilizar el objeto de su clase como clave en HashMap. HashMap usa una estructura de array + linkedList. Cuando se agrega un par de clave-valor, primero se hace un cálculo basado en el código hash de la clave para obtener el índice en matriz; luego vaya a través de la lista enlazada en esa posición de índice para encontrar si el par clave-valor ya está allí. Si es así, sobrescribirá el registro con un nuevo valor; de lo contrario, agregue el par clave-valor al final de dicha lista enlazada. Al ubicar una tecla, el proceso es simpático. Entonces, si el método hashCode no se sobrescribe, fallará la primera ronda de búsqueda en la matriz. Esa es la razón por la cual necesita anular ambos métodos. No es que en algún lado se diga que hay un contrato entre estos dos métodos o que tienen una relación cercana.

Cuestiones relacionadas