2017-01-12 4 views
-1

Ich habe Hashset whare i auf Objekte gesetzt werden Laden, und ich möchte bestimmtes Objekt zu finden, in diesem Fall, warum ich den Hash-Code außer Kraft setzen müssen tun, um und gleich Methode, die ich von unten Beispiel lesenWann brauche ich Hashcode und Equals-Methode?

public class Emp 
{ 
    private int age ; 

    public Emp(int age) 
    { 
     super(); 
     this.age = age; 
    } 

    public int hashCode() 
    { 
     return age; 
    } 

    public boolean equals(Object obj) 
    { 
     boolean flag = false; 
     Emp emp = (Emp)obj; 
     if(emp.age == age) 
      flag = true; 
     return flag; 
    } 
} 

Sie sagen Ich würde für die folgende Abfrage falsch erhalten, wenn ich den Hashcode und die equals-Methode nicht überschreibe.

System.out.println("HashSet Size--->>>"+hs.size()); 
System.out.println("hs.contains(new Emp(25))--->>>"+hs.contains(new Emp(25))); 
System.out.println("hs.remove(new Emp(24)--->>>"+hs.remove(new Emp(24)); 
System.out.println("Now HashSet Size--->>>"+hs.size()); 

Ich habe zu verwechseln, wie dies zu HashCode verwandt ist und ist gleich überprüft nur die enthält (ANYOBJECT) und (ANYOBJECT) in Hashset entfernen.

Kann mir jemand das obige Szenario erklären?

+3

Mögliche Duplikat: https://StackOverflow.com/Questions/2265503/Why-Do-Ineed-to-Override-the-Equals-and-hashcode-methods-in-Java?rq=1 –

+0

Sind Sie Fragen Sie, warum Sie einen von beiden außer Kraft setzen müssen oder warum Sie beide außer Kraft setzen müssen? Wenn letzteres: http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java – yshavit

+1

Wie soll der Container wissen, ob es enthält etwas, wenn es nicht sagen kann, ob zwei Dinge gleich sind oder nicht? Ebenso, wie soll es wissen, ob Dinge gleich sind, wenn Sie es nicht sagen, wie das geht? – azurefrog

Antwort

4

An der Basis Ihrer Verwirrung ist das Konzept der Identität vs Gleichheit, und was bedeutet es für eine Menge, ein Element zu enthalten. Lass mich versuchen zu erklären.

Angenommen, in einem Ort in Ihrem Code Sie dies getan haben:

HashSet<Emp> hs = new HashSet<>(); 
hs.add(new Emp(32)); 

In einem anderen Ort, Sie sehen wollen, ob ein Mitarbeiter für 32 Jahre in der Menge ist. Wie würdest du es machen? Sie können dies berücksichtigen:

boolean isThere = hs.contains(new Emp(32)); 

was sind Sie denn hier wird eine Instanz von Emp vorbei 32 an den Konstruktor zu schaffen, und dann vorbei die Instanz contain().

Beachten Sie, dass diese Instanz nicht dieselbe Instanz ist wie die, die Sie beim Hinzufügen zur Gruppe erstellt haben. Die Frage lautet also: Soll true zurückgeben, da diese Instanz mit der von Ihnen hinzugefügten identisch ist, oder sollte sie false zurückgeben, da es sich nicht um dieselbe Instanz handelt? Das Ergebnis hängt davon ab, wie hashCode() und equals() für Emp implementiert sind. Bei der Standardimplementierung gibt equals() nur dann true zurück, wenn die übergebene Instanz dieselbe ist, die enthalten ist (d. H. == verwendet, um die Instanz zu vergleichen, die an übergeben und an die Instanz übergeben wurde). In diesem Fall würde false zurückgegeben werden.

Um zu verstehen hashCode(), müssen Sie verstehen, wie ein HashSet funktioniert. Wenn Sie ein Element zu einem HashSet hinzufügen, wird ein Index in einem Array aus dem Element mit hashCode() % <size of the array> berechnet. Das Element wird dann als Wert am entsprechenden Index gesetzt.

Da verschiedene Elemente am Ende dieselben hashCode() haben können, können mehr Elemente im selben Index abgebildet werden. In diesem Fall wird eine Liste von Kollisionen beibehalten.

Also, zurück zu Ihrem Fall, warum müssen Sie hashCode() implementieren? Da die Standardimplementierung unterschiedliche Zahlen für verschiedene Instanzen von Ent zurückgibt, kann das Ereignis age dasselbe sein (Die Implementierung ist JVM-abhängig, z. B. könnte sie die Adresse im Speicher der Instanz zurückgeben). Damit contain funktioniert, müssen wir sicherstellen, dass für beide Instanzen derselbe Index im Array berechnet wird. Daher müssen Sie ihn entsprechend implementieren. Zum Beispiel könnte in diesem Fall hashCode() das Alter selbst zurückgeben.

Verwandte Themen