2016-11-25 3 views
0

Ich habe unter Code und ich habe Break-Punkte auf überschrieben equals() und hashCode() Methoden von ContainerBean platziert. Wenn ich unterhalb der Anwendung im Debug-Modus laufe, stoppt der Debugger bei hashCode() nur für System.out.println Zeile und nicht beim Versuch, Element aus List zu entfernen.Debug equals() und hashCode() in Eclipse

import java.util.ArrayList; 
import java.util.List; 

public class ListRemovalDriver { 

    public static void main(String[] args) { 
     List<ContainerBean> remitClaims = new ArrayList<>(); 

     ContainedBean addedRemit1 = new ContainedBean(); 
     addedRemit1.setRemitId(12345L); 
     ContainerBean added1 = new ContainerBean(); 
     added1.setRemitBean(addedRemit1); 

     remitClaims.add(added1); 

     ContainedBean removedRemit1 = new ContainedBean(); 
     removedRemit1.setRemitId(12345L); 
     ContainerBean removed1 = new ContainerBean(); 
     removed1.setRemitBean(removedRemit1); 

     System.out.println("List before valid removal" + remitClaims); 

     remitClaims.remove(removed1); 

     System.out.println("List after valid removal" + remitClaims); 



    } 
} 

Fehle ich etwas?

Würde überschrieben werden equals() in ContainerBean nicht beim Entfernen Element aus der Liste aufgerufen werden?

EDIT

Ich vergaß zu erwähnen, dass hashCode() und equals() arbeiten wie erwartet das heißt Elemente wie pro equals() Logik aber es ist nur Debugger entfernt zu werden, die mich nicht dort nehmen auf Funktion Anrufliste entfernen.

Antwort

1

außer Kraft gesetzt würde equals() in ContainerBean nicht aufgerufen werden, während Element aus der Liste entfernen?

Ja, wenn Sie remove(Object o) verwenden, dann equals() in ContainerBean wird die Gleichheit des Objekts zu überprüfen aufgerufen werden, und entfernen Sie sie dann aus der Liste wie in dem ArrayList API unter (Hervorhebung von mir) erwähnt :

Entfernt das erste Vorkommen des angegebenen Elements aus dieser Liste, , wenn es vorhanden ist. Wenn die Liste das Element nicht enthält, ist es unverändert. Formal entfernt man das Element mit dem niedrigsten Index i so, dass (o == null? Get (i) == null: o.equals (get (i))) (wenn ein solches Element existiert). Gibt true zurück, wenn diese Liste das angegebene Element enthält (oder äquivalent, wenn diese Liste sich aufgrund des Aufrufs geändert hat).

Aber auf der anderen Seite, wenn Sie ein Element mit dem Index der Liste entfernen möchte (das heißt, mit remove(int index)), dann wird es nicht sein equals() überprüfen.

können Sie sehen here

+0

Wie in meinem Code gezeigt, werde ich nicht per Index entfernen, sondern ein Objekt zu entfernen. Das Objekt wird erfolgreich entfernt, aber sein einziger Eclipse-Debugger führt mich bei diesem Ereignis nicht dorthin. –

+0

Ich weiß das, ich habe gerade diesen Punkt hinzugefügt, damit Sie den Unterschied verstehen. – developer

1

Quellcode der Arraylist von jdk 7,

ArrayList.remove(Object o) 

es Methode ruft gleich das Objekt, um zu überprüfen aus der Sammlung

for (int index = 0; index < size; index++) 
    if (o.equals(elementData[index])) { 
     fastRemove(index); 
     return true; 
    } 
} 

Quelle zu entfernen: ArrayList Source

2

Da Sie den Code nicht geben habe ich erraten müssen: Sie haben nicht equals überschreiben, sondern eine Überlastung wie folgt hinzugefügt:

public boolean equals(ContainerBean c) { ... } 

Das wird nicht funktionieren, weil equals (Objekt) wird aufgerufen.

Ändern Sie Ihre equals-Implementierung, um ein Argument vom Typ Object zu verwenden, und es wird sowohl im Eclipse-Debugger aufgerufen als auch gestoppt.

+0

Ich habe es überschrieben. "Objekt" als Argument nehmen. –

+0

Dann müssen Sie Ihren Code zeigen. 'ArrayList.remove (Object)' ruft 'equals()' auf, wenn die Liste nicht leer ist und das Argument nicht 'null' ist. – Axel

+0

PS: Oder hast du versehentlich den Breakpoint auf 'equals()' in 'ContainedBean' anstelle von' ContainerBean' gesetzt? Sie sollten einen Haltepunkt in der Zeile platzieren, die den Aufruf von 'remove()' enthält, und in diese Methode einsteigen, um das herauszufinden. – Axel

Verwandte Themen