Frage Überprüfen Sie, ob das Element in HashSet durch seinen Hash existiert


Kann ich prüfen, ob sich ein Objekt in einem befindet? HashSet wenn ich nur den Hash-Code des Objekts habe, aber nicht das Objekt selbst?


5
2018-02-23 17:11


Ursprung


Antworten:


Du kannst nicht, seit dem hashCode wird nur verwendet, um den Behälter zu finden, in dem das Objekt gespeichert ist HashSet. Es kann mehrere Elemente in demselben Bin geben, und HashSet Verwendet equals um zu bestimmen, ob das gesuchte Element in der Bin existiert, die das hashCode wurde zugeordnet.

Der Behälter kann mehrere gleiche Elemente enthalten hashCode, also nur das Wissen hashCode ist nicht genug.


9
2018-02-23 17:13



Sie können ein spezielles Objekt erstellen, etwa so

int hashCode = 1;  // your 
new Object() {
    @Override
    public boolean equals(Object obj) {
        return true;
    }
    @Override
    public int hashCode() {
        return hashCode;
    }
};

3
2018-02-23 17:18



Nein, kannst du nicht. Beide Gleichheitszeichen und Hashcode werden benötigt, um ein Objekt in einer Hash-Sammlung zu finden. Die Hashcode-Methode gibt an, in welchem ​​Bucket das Objekt gefunden wird, und die Methode equals findet das Objekt im Bucket.

Ein Beispiel aus der realen Welt wäre ein Haus mit vielen Menschen darin. Wenn Sie mir sagen, dass ich jemanden in einem Haus finden soll, werde ich Ihnen zwei Fragen stellen:

  1. In welches Haus gehe ich?
  2. Wen finde ich?

Hier wird (1) mit dem Hashcode beantwortet und (2) mit der Methode equals beantwortet.


1
2018-02-23 17:15



EIN hashCode ist keine eindeutig identifizierende Eigenschaft, also nein.


1
2018-02-23 17:17



Nein, weil 2 Objekte denselben Hashcode haben können. Die Einzigartigkeit von Objekten in einem Set (oder Schlüssel in einem Map) wird gegen überprüft hashCode()  und  equals().


1
2018-02-23 17:17



Alle Objekte haben die Methode hashCode (), aufgerufen von HashSet, HashMap, ecc ..

Sie können diese Methode überschreiben, um Ihre eigene Logik zu definieren

   @Override
    public int hashCode() {
        return <<MY CODE HERE>>;
    }

oder, einfacher, iterieren Sie Ihr HashSet und überprüfen Sie den Wert von hashCode ()

int myHash = 123;
for(Object o:mySet){
  if(myHash == o.hashCode()){
    // do something..
  }
}

0
2018-02-23 18:39