2012-10-16 19 views
6

Ich habe ein Programm für meine Java-Klasse, wo ich HashSets verwenden, um ein Verzeichnis von Textdokumenten zu vergleichen. Im Wesentlichen ist mein Plan, einen HashSet von Zeichenketten für jedes Papier zu erstellen, und dann zwei der Papiere hashSets zusammen in ein HashSet hinzuzufügen und die Anzahl der gleichen 6-Wort-Sequenzen zu finden.HashSet Kollisionen in Java

Meine Frage ist, muss ich Kollisionen manuell überprüfen und behandeln, oder macht Java das für mich?

+1

Sie finden Sie ans [hier] (http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions) –

Antwort

3

Java Hash Maps/Sets Hash-Kollisionen werden automatisch gehandhabt, deshalb ist es wichtig, sowohl die equals als auch die hashCode Methoden zu überschreiben. Beide werden von Sets verwendet, um doppelte oder eindeutige Einträge zu unterscheiden.

Es ist auch wichtig zu beachten, dass diese Hash-Kollisionen einen Leistungseinbruch haben, da mehrere Objekte durch denselben Hash referenziert werden.

public class MyObject { 
private String name; 

//getter and setters 


public int hashCode() { 
    int hashCode = //Do some object specifc stuff to gen hashCode 
    return int; 
} 

public boolean equals(Object obj) { 
    if(this==obj) return true; 
    if(obj instanceOf MyObject) { 
     if(this.name.equals((MyObject)obj.getName())) { 
      return true; 
     } 
    return false; 
} 
} 
} 

Hinweis: Standard Java-Objekte wie String haben hashCode bereits umgesetzt und entspricht damit nur Sie, dass für die eigene Art von Datenobjekten zu tun haben.

+0

Okay, cool. Ich habe eine ganze Menge Posts gelesen, in denen stand, dass HashMaps eine integrierte Kollisionsabfrage hatte, aber ich konnte nichts finden, das ausdrücklich darauf hinwies, dass HashSets eine integrierte Kollisionsabfrage hatte. – marcinx27

+0

Bitte beachten Sie meine Bearbeitung: Es ist wichtig, sowohl hashCode- als auch equals-Methoden zu überschreiben, da beide von Sets verwendet werden, um Duplikate zu identifizieren. – dngfng

+0

Was meinst du? – marcinx27

0

Ich glaube, Sie haben nicht nach Hash-Kollisionen gefragt, oder? Die Frage ist, was passiert, wenn HashSet a und HashSet b zu einem einzigen Satz hinzugefügt werden, z. von a.addAll (b).

Die Antwort ist ein Wille enthält alle Elemente und keine Duplikate. Im Fall von Strings bedeutet dies, dass Sie die Anzahl der gleichen Zeichenfolge aus den Mengen mit a.size() vor add - a.size() nach add + b.size() zählen können.

Es ist nicht einmal wichtig, wenn einige der Strings den gleichen Hash-Code haben, aber nicht gleich sind.

+0

Es ist nur wahr, wenn Sie String-Objekte zum Set oder anderen Objekten hinzufügen, die bereits HashCode und Equals implementiert haben. Wenn Sie ein eigenes Objekt haben, müssen Sie beide implementieren. – dngfng

+0

Art von. Was ich sage ist, dass, wenn ich a.addAll (b) mache, es sicher ist, dass ich keine Duplikate haben werde, und ist es sicher, dass jede eindeutige Zeichenkette von a und b da sein wird? – marcinx27

+0

@dngfng Also, wenn ich Strings verwende, muss ich nicht auf Kollisionen prüfen. Ich kann einfach alle Strings in ihre hashSets einfügen und sicher sein, dass alles eindeutig ist und dass es keine Duplikate gibt? – marcinx27