Wie mach ich ein HashSet für eigene Objecte?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Code:
package crawler.path;

import java.util.HashSet;

/**
 *
 * @author 
 */
public class paths extends HashSet<crawlDing>{

    
    
    
}

Code:
public class crawlDing {

    String s1,s2;

    public crawlDing(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public boolean equals(Object obj) {
        crawlDing cd=(crawlDing) obj;
        return true;
    }
    
}

also wenn ich jetzt
Code:
 quequed.add(new crawlDing("asdf", "asdf"));
        quequed.add(new crawlDing("asdf", "asdddf"));
       System.out.println(quequed.contains(new crawlDing("asdf", "asdf")));
bekomme ich trotzdem immer false zurück. Warum?
Wie mach ich es das HashSet überprüft ob die Strings in der Klasse CrawlDing gleich sind?
 
S

SlaterB

Gast
das wichtigste bei einem HashSet ist offensichtlich der Hash-Wert

überschreibe die hashCode()-Operation so, dass gleiche Objekte den gleichen Hashcode zurückgeben
(z.B. die Summer der Hashcodes der beiden enthaltenen Strings)

das ist übrigens auch ein allgemeines Java-Gesetz:
equals und hashCode müssen zusammenpassen
(genauer Laut in der API bei Object nachzulesen/ Lehrbuch/ oder postet noch jemand ;) )

standardmäßig entspricht der Hashcode etwa der Speicheradresse des Objektes
-> unterschiedliche Objeke haben unterschiedlichen Wert -> nicht gleich im Set
 
G

Gast

Gast
also bedeuted das, das ich hash code überschreiben muss?

oder soll ich ne andere collection verwenden?
 
G

Gast

Gast
habs jetzt so gemacht:
Code:
  public int hashCode() {
        return path.hashCode()+type;
    }

    @Override
    public boolean equals(Object obj) {
        return obj.hashCode()==this.hashCode();
    }

oder soll ich ne andere collection verwenden?
 

SebiB90

Top Contributor
SlaterB hat gesagt.:
standardmäßig entspricht der Hashcode etwa der Speicheradresse des Objektes
wenn es so wäre dann wäre doch hashcode nur gleich wenn auch vergleich mit == true wäre.
aber der is doch auch gleich wenn nur der inhalt gleich is...
 
M

maki

Gast
wenn es so wäre dann wäre doch hashcode nur gleich wenn auch vergleich mit == true wäre.
Die Standard Implementierung verhält sich so wie von SlaterB beschrieben, die Java 5 API Dok enthält eigentlich alles was man zu diesem Thema Wissen müsste:
hashCode

public int hashCode()

Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

The general contract of hashCode is:

* Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
* If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
* It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashcode
 
S

SlaterB

Gast
> dann wäre doch hashcode nur gleich wenn auch vergleich mit == true wäre.

weitgehend richtig, siehe aber aber auch b) weiter unten

> aber der is doch auch gleich wenn nur der inhalt gleich is...

falsch oder Gegenbeispiel nennen ;)
dass es für bestimmte Objekte wie String anders aussieht,
ist unbestritten

---------

> habs jetzt so gemacht:

> public int hashCode() {
> return path.hashCode()+type;
> }


ohne zu wissen was path und type ist, kann man dazu kaum was sagen,
sieht aber gut aus,
die equals-Operation halbwegs ok, aber gefährlich, 3 Hinweise:
a) funktioniert nur dann einigermaßen, wenn hashCode alle enthaltenen Felder berücksichtigt,
übrigens könnte die hashCode()-Berechnung aufwändiger als andere Überprüfungen sein,
bei zwei String kann man anhand der Länge die meisten Unterschiede sofort erkennen, da muss nicht unbedingt der hasCode über jeden Buchstaben einzelnd errechnet werden

b) du hast noch die Gefahr, dass dein Hashcode zufällig dem eines anderen Objektes entspricht, welches nicht equal ist,
es gibt nur Integer.MAX_VALUE Hashcodes,
aber bestimmt viel mehr Möglichkeiten, etwa Strings der Länge 10 oder höher bei den Unmengen an verschiedenen Buchstaben,

aus equal folgt zwingend gleicher Hashcode, aber gleicher Hashcode heißt normalerweise nicht immer equal,
ist zwar wahrscheinlich und daher so nützlich für das HashSet,
aber nicht zwingend

c) auch ein Objekt einer ganz anderen Klasse könnte den gleichen Hashcode haben

-----------

> oder soll ich ne andere collection verwenden?

für TreeSet musst du glaube ich Comparable implementieren,
aber schaue dir doch mal alle verfügbaren Sets an,
nur mit equals wirds knapp,
dann kannst du aber immer noch eine normale Liste nehmen und vor jedem Einfügen contains() prüfen, das läuft die ganze Liste durch und verwendet nur equals()
 

SebiB90

Top Contributor
SlaterB hat gesagt.:
> dann wäre doch hashcode nur gleich wenn auch vergleich mit == true wäre.

weitgehend richtig, siehe aber aber auch b) weiter unten

> aber der is doch auch gleich wenn nur der inhalt gleich is...

falsch oder Gegenbeispiel nennen ;)
dass es für bestimmte Objekte wie String anders aussieht,
ist unbestritten
naja ich hab hashcode() bisher net verstanden
und werds wohl net verstehen.
ich seh darin kein sinn, was der mir zeigen soll.
will ich gleiche speicheradresse wissen dann ==
will ich gleichen inhalt wissen dann equals
also für was hashcode, wobei da doch auch immer wie du auch gesagt hast, die gefahr kommt das 2 verschiedene objekte den gleichen haben.

also falls einer mir das mal erklären will, nach dem motto "hashcode für dummies", schreibt hier oder ne pn, falls offtopic werden würde^^
 
M

maki

Gast
Die einfachste Art mit equals und hashcode umzugehen ist: Sie nicht zu überschreiben :)

Ansonsten wird's immer kompliziert...

Ein anderes Problem:
Angenommen der hashcode (und damit equals auch) eines Objektes beruht auf dem Wert von ein paar Attributen anstatt wie in der Standardimplementierung auf der Addresse des Objektes.

Was passiert, wenn ich ein Objekt in eine Hash-Table/Set/Map ablege, und sich danach die Attribute auf dem der hashcode beruht ändern?
Das Objekt würde man nie wieder in der Hash-Table/Set/Map finden, zumindest nicht über den hashcode, schliesslich hat sich der hashcode des Objektes im nachhinein geändert... damit so etwas funktioniert, müsste man die Objekte als Immutables entwerfen.

Punkt 7 und 8 in "Effective Java Programming" geht im Detail auf die Problematik um equals und hashcode ein.
 
S

SlaterB

Gast
ach das ist ja so ein schönes Thema, da erzähle ich dann gerne weiter,
statt auf Bücher zu verweisen ;)


HashCode ist z.B. für die Doppelten-Suche gedacht, wie hier gewünscht,

schlecht wäre, die Objekte in eine Liste zu stecken und dann mit contains die ganze Liste zu durchlaufen und mit jedem Objekt zu vergleichen,

bei einem Vergleich muss jedesmal von vorne, bei 0 angefangen werden,
schlauer ist dagegen, einen Index aufzubauen, alle Elemente EINMAL auf eine Zahl, 1, 2, 3, 454664 usw. abzubilden,
diese Zahlen berechnet man einmal und speichert sie geeignet,
Zahlen kann man ja gut sortiert ablegen und schnell wiederfinden

dann berechnet man für ein neues Element nur EINMAL den Hashcode, z.B. 4745, und schaut nach, ob schon Elemente zu 4745 da sind,
da die Anzahl der Zahlen begrenzt ist, können das durchaus auch mehrere Elemente zum Hashcode da sein sein,
aber bei einer guten Hash-Funkion eben durchschnittlich höchstens 0,00...01% aller Elemente,
für diese muss dann ganz trivial jeweils equals aufgerufen werden

auch Maps können so arbeiten, ist ja im wesentlichen die Suche nach den Keys,

------------

vereinfachtes Beispiel: CD/ Bücher-Regal nach ersten Buchstaben sortieren, das ist die Hashfunktion, die Werte sind A-Z,
wenn du ein Buch names "Bibel" suchst, musst du dann nur noch die B-Bücher alle durchschauen, nur noch 1/ 26 der Arbeit,
die Berechnung des ersten Buchstabens (B) und die Markierung im Bücherregal, wo B anfängt und aufhört sind dagegen ein geringer Zusatzaufwand
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Wie mach ich das? Java Basics - Anfänger-Themen 7
Excess Operatoren Wenn Variable x den Wert y hat, dann mach was Java Basics - Anfänger-Themen 11
M Aus einer mach 2 Java Basics - Anfänger-Themen 5
L Erste Schritte Was mach ich falsch? thx Java Basics - Anfänger-Themen 3
K aus String mach Float funktioniert nicht warum? Java Basics - Anfänger-Themen 7
K Array fehler... was mach ich falsch? Java Basics - Anfänger-Themen 3
H Konstruktor nicht definiert wie mach ch es richtig?? Java Basics - Anfänger-Themen 24
C was mach ich erst wenn die programme richtig schwer werden? Java Basics - Anfänger-Themen 2
S Threads: synchronized mach nicht was es soll? Java Basics - Anfänger-Themen 6
M Could not find the main class. --> Und was mach ich jetzt Java Basics - Anfänger-Themen 6
J Mach mal ne Pause Java Basics - Anfänger-Themen 9
S wie mach ich eine .exe? Java Basics - Anfänger-Themen 4
G Was mach ich falsch Java Basics - Anfänger-Themen 6
M Arrays: aus 2 mach 1 Java Basics - Anfänger-Themen 4
S will instanz einer Klasse erzeugen - mach irgendwas falsch Java Basics - Anfänger-Themen 6
W Aus Iteration mach Rekursion Java Basics - Anfänger-Themen 3
B Was mach ich falsch mit einem Menü in Swing Java Basics - Anfänger-Themen 2
B Was mach ich falsch mit dem Aufruf einer Funktion? Java Basics - Anfänger-Themen 12
P Wie mach ich aus Int ein Double oder Long ? Java Basics - Anfänger-Themen 6
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
D Erste Schritte Code verstehen - HashSet Java Basics - Anfänger-Themen 8
J Hashset Java Basics - Anfänger-Themen 13
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
W Element aus HashSet in String umformen Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
C Auf einzelne Werte aus HashSet zugreifen Java Basics - Anfänger-Themen 10
J Klassen HashSet, TreeSet: unregelmäßige Zahlenreihen beim Befüllen Java Basics - Anfänger-Themen 7
T Methoden HashSet Objekt mit Zufallszahlen befüllen Java Basics - Anfänger-Themen 3
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
W Verknüpfung von Räumen mit Hashset Java Basics - Anfänger-Themen 10
J HashSet contain Methode funktioniert nicht wie gewollt Java Basics - Anfänger-Themen 7
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
R Hashset.add(Array) liefert immer true? Java Basics - Anfänger-Themen 23
Mrtwomoon Collections Hashset elemente ohne Eckigeklammer ausgeben Java Basics - Anfänger-Themen 9
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
A Elemente in HashSet enthalten oder nicht Java Basics - Anfänger-Themen 6
A HashSet (oder besser geignetes) Java Basics - Anfänger-Themen 14
T Hashset - Allgemeine Fragen Java Basics - Anfänger-Themen 19
J So ähnlich wie HashSet Java Basics - Anfänger-Themen 2
D HashSet vs Liste Java Basics - Anfänger-Themen 5
T HashSet Java Basics - Anfänger-Themen 3
F suche Elemente in HashSet Java Basics - Anfänger-Themen 5
E Collections HashSet - Ausgabe sortiert? Java Basics - Anfänger-Themen 3
J HashSet Fehlerhaft Java Basics - Anfänger-Themen 10
J HashSet Implementierung Java Basics - Anfänger-Themen 16
D Problem mit HashSet Java Basics - Anfänger-Themen 12
darekkay Datentypen HashSet bzw. LinkedList mit Werten initialisieren Java Basics - Anfänger-Themen 3
B Hashset iterieren problem Java Basics - Anfänger-Themen 3
C HashSet Problem Java Basics - Anfänger-Themen 3
DasBrot Datentypen HashSet contains() Java Basics - Anfänger-Themen 3
F HashSet u. LinkedHashSet Zugriff auf Werte? Java Basics - Anfänger-Themen 2
F HashSet und LinkedHashSet Instanzierung warum so? Java Basics - Anfänger-Themen 7
M HashSet.contains() Java Basics - Anfänger-Themen 2
N Map<String, HashSet<String>> Umwandeln in Map<String, ArrayList<String>> Java Basics - Anfänger-Themen 14
neurox Limit bei HashSet? Java Basics - Anfänger-Themen 2
Povlsen84 HashSet mit eigenen Datentypen Java Basics - Anfänger-Themen 6
G HashSet vs. TreeSet Java Basics - Anfänger-Themen 3
G hashset überschreibt werte bei add Java Basics - Anfänger-Themen 1
M HashSet Initialisierungsgröße? Java Basics - Anfänger-Themen 5
F doppelte Elemente in HashSet Java Basics - Anfänger-Themen 5
G Probleme mit HashSet Java Basics - Anfänger-Themen 5
S HashSet in HashMap, Zugriff Java Basics - Anfänger-Themen 3
G Zahlen aus HashSet in ein int Array übergeben Java Basics - Anfänger-Themen 15
G Hashset verknüpfen mit BufferedReader Java Basics - Anfänger-Themen 18
L Was ist ein HashSet? Java Basics - Anfänger-Themen 33
G HashSet Java Basics - Anfänger-Themen 21
P HashSet und Referenzen Java Basics - Anfänger-Themen 9
B Warum hat HashSet kein get(Object o) ? Java Basics - Anfänger-Themen 8
H umwandeln zu Hashset ?! Java Basics - Anfänger-Themen 7
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben