2013-06-23 3 views
2

Я пытался реализовать метод equals и hashCode, поэтому я мог бы использовать метод remove arrayList.equals и hashCode определены, методы arrayList все еще не работают

Когда я выполнить следующее

Node a = new Node(new Coord(0,0)); 
    System.out.println(a.equals(nodes.get(0))); 
    System.out.println(nodes.get(0).equals(a)); 
    System.out.println(a.hashCode() == nodes.get(0).hashCode()); 
    System.out.println(nodes.remove(a)); 

я получаю следующий результат:

true 
true 
true 
false 

Вопрос заключается в том, как может первые 3 выходного возвращения верно, когда 4-я возвращает ложь. Метод remove должен столкнуться с node.get (0) и сравнить его с a.

Это мои равенства и методы Hashcode:

public int hashCode() { 
    return coord.hashCode(); 
} 

public boolean equals(Node node) { 
    return (node != null) && (this.hashCode() == node.hashCode()); 
} 

, который вызывает метод coord.hashCode(), который определяется как:

public int hashCode() { 
    int hash = 23; 
    hash = 31 * hash + this.x; 
    hash = 31 * hash + this.y; 
    return hash; 
} 
+0

Существует история, без вопросов. – Maroun

+0

И включите объявление "узлы". – monkjack

+0

Вы можете использовать @Override (> = JDK5), чтобы убедиться, что ваш определенный метод не просто перегружает родительский, но по-настоящему отменяет его. – Mik378

ответ

11

Вашего текущего equals() метод не делает переопределения Object.equals() , это перегрузки it.

Изменение equals(), чтобы принять Object параметр:

public boolean equals(Object o) { 
    return (o instanceof Node) && (this.hashCode() == o.hashCode()); 
} 

Java имеет @Override аннотацию, что вы можете положить на методах поэтому компилятор сообщит вам, если ваш метод, фактически не переопределения. Это хорошая практика, чтобы использовать его, поэтому вы избегаете таких проблем, как компиляции времени.


Обратите внимание, что равняется реализации есть ошибка: Вы не должны сравнивать хэш-коды - два «неравных» объекты могут (несчастию) имеют один и тот же хэш-код.

Сравнение полей, а не хеш-кода.

+0

Сладкий, вот и все! –

+0

Или добавьте (рекомендуется) аннотацию @Override к вашей фактической реализации метода - которая сразу выявляет причину вашей проблемы ... –

1

Вы не можете сравнивать равно используя метод хэш-код, почему:

a.equals (б) == верно, a.hashCode() в обязательном порядке == b.hashCode()

а. hashCode() == b.hashCode(), a.equals (b) NOT является обязательным, больше может быть == false

Пример реализации с использованием одного атрибута (x). Сгенерируйте по eclipse:

public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + x; 
    return result; 
} 

public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Node other = (Node) obj; 
    if (x != other.x) 
     return false; 
    return true; 
} 
Смежные вопросы