HashMap.containtsKey

ArniBoy

Mitglied
Hi Forum,

ich arbeite jetzt eigentlich schon eine Weile (im Studium) mit Java, aber ich denke mein Problem passt wohl immer noch hier am besten rein.
Also, ich schreibe ein Programm, in dem ein Objekt über eine HashMap verfügt, die es selber mit Werten füllt. Diese Map wird von einer anderen Klasse benutzt. Aber sämtliche Operationen, die in dieser Liste nach Keys suchen geben definitiv falsche Ergebnisse raus.
Mein erster verdacht war, dass die equals() der Objekte in der Map fehlerhaft ist, schließlich habe ich die selber geschrieben. Aber lokale tests (in der Klasse, die die HashMap operationen auszuführen versucht) ergaben, dass diese sehr wohl funktionieren.
Hier kurz als Ausschnitt der kritische Teil des Codes:
Code:
Public Class Testing{
    Examples.init();                            // Initialisieren des Inhalts der Hashmap 
    HashMap map=Examples.getMap();              // Verweis auf die Map in dieser Klasse, ausgabe aller Werte würde ergeben, dass ein Pair a,b enthalten ist.
    Pair test1=new Pair("a","b");               // Erstellen eines in der Map existenten Eintrag in dieser Klasse
    System.out.println(map.containsKey(test1)); // Ausgabe ist: false    =/
}

;(

Ich hänge jetzt schon seit Stunden davor..
 
Zuletzt bearbeitet von einem Moderator:

njans

Top Contributor
Ich bin mir nun nicht ganz sicher, ob das der Grund ist, aber hast du denn auch die Methode hashCode überschrieben ?
 

ArniBoy

Mitglied
Nein, habe ich nicht. Die habe ich auch nie benutzt.
Ich erinnere mich dunkel an einen Zusammenhang mit equals.. ich sollte vielleicht mal die API durchstöbern ^^
 

Aldimann

Bekanntes Mitglied
Die zwei Methoden hängen defintiv zusammen.

Ürigens mit deinem Code oben kann ich rein _gar nichts_ anfangen.

Wenn also das Problem noch nicht gelöst ist bitte möglichst den ganzen Code hier posten und am besten so zusammen gekürzt, dass der Code möglichst wenig ist aber dein Problem immernoch widerspiegeln kann...

Grüße
 

njans

Top Contributor
Also aus Erfahrung meine ich mich zu erinnern, dass du zwangsweise hashCode überschreiben musst.
Sonst wirst du kein equals == true bekommen. Ansonsten ja, mehr und ein KSCB wäre gut :)
 

tsitra

Bekanntes Mitglied
Also aus Erfahrung meine ich mich zu erinnern, dass du zwangsweise hashCode überschreiben musst.

Da habe ich eine gegensätzliche Erinnerung!

Es wird meines Wissens nicht zwangsweise gefordert, dass hashCode() überschrieben wird
sobald equals() überschrieben wird.
Es mag eine Schwachstelle von Java sein ...!?

Es handelt sich nur um eine Empfehlung.

Es gibt sogenannte contracts, einen für equals() und einen hashCode() und da wird
deklariert, dass zwischen equals() und hashCode eine bestimmter sinnvoller bzw. praktischer Zusammenhang besteht.

Gruß
tsitra
 

faetzminator

Gesperrter Benutzer
Es wird meines Wissens nicht zwangsweise gefordert, dass hashCode() überschrieben wird
sobald equals() überschrieben wird.

Wenn equals nicht überschrieben wird, dann sollte diese eigentlich immer [c]false[/c] liefern (ausser die Referenz ist wirklich gleich).
Wird hashCode nicht überschrieben (und der Code darum gleich!?), dann ist der Rechenaufwand für die Map AFAIK grösser, da er noch per equals vergleichen muss. Oder gibt hashCode immer was anderes? Die API sagt mir da irgendwie nichts wirklich nützliches. Auf alle Fälle suboptimal.
 

Shulyn

Bekanntes Mitglied
könntest du evtl den code von folgender methode zeigen :
Würde gerne wissen wie deine Map genau aussieht...
Java:
Examples.init();    // <--
 

Aldimann

Bekanntes Mitglied
Wenn equals überschrieben wird MUSS auch hashcode überschrieben werden. Sonst kann das zu größeren Problemen führen eben bzgl. Objekten die in HashMaps o.ä. verschwinden.

Für die zusammenarbeit zwischen Equals und HashCode gilt:
HashCode MUSS immer den selben HashCode für Objekte die Equals sind zurück geben. Sind Objekte unterschiedlich KANN aber muss nicht der HashCode anders sein.

D.h. auf hashCode immer 0 zurück zu geben ist valide! Aber ineffizient, aber aus anderen Gründen.

Achtung! Es gibt weitere Regeln für die Implementierung von Equals!

Jeder der diese Regeln nicht befolgt ist selber Schuld wenn bei ihm Elemente verloren gehen ;).

Grüße
 
S

SlaterB

Gast
@Shulyn
da wird nichts spannendes stehen, nur u.a. auch bereits einmal new Pair("a","b") eingefügt,
das wird als Kopie erstellt nicht gefunden weil eben standardmäßig anderer Object-Hashcode,
kein großes Geheimnis dabei
 

tsitra

Bekanntes Mitglied
... nur u.a. auch bereits einmal new Pair("a","b") eingefügt,
das wird als Kopie erstellt nicht gefunden weil eben standardmäßig anderer Object-Hashcode,
kein großes Geheimnis dabei

Zustimmung!:applaus:

Als ich das nachträgliche
Pair test1=new Pair("a","b");
gesehen hatte, dessen Vorhandensein dann mit
System.out.println(map.containsKey(test1));
geprüft wird,
hatte ich auch diese Idee, war mir jedoch nicht 100% sicher.
 

ArniBoy

Mitglied
Danke für die Antworten =)

Die API hat mir bei meinem Problem nicht wirklich geholfen, da ich nach einer konreten implementirung für hashCode() gesucht habe, die verrät ja nicht einmal, wie die defaultbelegung von hasCode() ist =/
Google wusste das allerdings schon: Hier. Da steht, wie man hashCode() sinnvoll überschreibt.
 
S

SlaterB

Gast
wie man angesichts von Lehrbüchern und solchen Links immer wieder lesen muss dass die API irgendwas ausreichend erklärt,
wundert mich auch oft ;)
es gibt Beispiele wie Klasse Pattern zu RegEx, wo ich auch direkt nachschlage, aber das sind Ausnahmen
 

faetzminator

Gesperrter Benutzer
Eclipse weiss es auch :) die Felder sind von mir, die Methode generiert:
Java:
private String foo;
private int bar;

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + bar;
    result = prime * result + (foo == null ? 0 : foo.hashCode());
    return result;
}
 

fastjack

Top Contributor
Der Default-Hashcode ist in der Api erwähnt:

(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.)

okay, is not required, aber normalerweise die Speicheradresse, zumindest aus meiner Erfahrung bei Sun und openJDK. Aber stimmt schon, einiges muß man sich selber zusammenlesen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
O HashMap Fragen Java Basics - Anfänger-Themen 8
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben