Hashtables und hashCode()

Status
Nicht offen für weitere Antworten.

ugh_bough

Mitglied
Hi.
Frage.

Ich hab mir nen Hashtable gemacht, der als Schlüssel Objekte einer von mir erstellten Klasse bekommt.
Diese ist wiederum von einer anderen Klasse abgeleitet, in der ich die
Code:
equals()
und die
Code:
hashCode()
Methoden überschrieben habe.

Wenn ich in diesen Methoden verschiedene Ausgaben in die Kommandozeile produziere, sehe ich, daß der HashTable die equals() - Methode überhaupt nicht benutzt, die hashCode() - Methode dagegen die ganze Zeit.

Die überschriebene hashCode() - Methode funktioniert ohne Probleme. Sie gibt den hashCode eines im Objekt gespeicherten Strings zurück. Sind also in einem Objekt gleiche Strings, so haben sie auch den gleichen hashCode.
(Das hab ich auch schon getestet).

Nun zum Problem. Die Methode
Code:
Hashtable.get(Object key)
funktioniert nicht. Sie kann, obwohl der gleiche hashCode generiert wird, nicht zwei in dem Sinne gleiche Objekte als gleich erkennen => Sie liefert keinen Wert zurück.

Was kann ich nur tun? :bahnhof:

Danke.
ugh_bough[/code]
 

akira

Bekanntes Mitglied
Hi,

Wenn ich in diesen Methoden verschiedene Ausgaben in die Kommandozeile produziere, sehe ich, daß der HashTable die equals() - Methode überhaupt nicht benutzt, die hashCode() - Methode dagegen die ganze Zeit.

Das die equals-Methode nie benutzt wird kann eigenlich nicht sein, da diese bei get und put auf jeden Fall aufgerufen wird. Poste doch mal ein bischen mehr Code, wie Du mit Deinen Objekten und der Hashtable arbeitest.

Edit: Hab gerade nochmal nachgesehen, bei wenigen Objekten (default=11) mit verschiedenem Hashcode wird die equals-Methode wirklich nicht aufgerufen.
 

ugh_bough

Mitglied
Also hier die Methoden aus der Superklasse von DiTag
Code:
    /** Checks if two GenStrings represent the same.
     * @param other The GenString to check.
     * @return False if GenStrings are different. True if they are equal.
     */
    public boolean equals(GenString other)
    {
    	// Check content of string, because internal StringBuffers might differ
        return this.toString().equals(other.toString());
    }
    
    /** Returns the hashCode of this object.
     * @return The hashCode.
     */
    public int hashCode()
    {
    	return this.toString().hashCode();
    }
Die toString() - Methode nimmt gibt den internen String zurück.
Und hier die Schleife, die eigentlich im Value Feld einen Zähler immitieren soll. (Kennst das Vorgehen ja sicher)
Code:
		int[] occ = concatemer.occurencesOf("CATG", GenString.DEFINITE);
		
		DiTag diTag;
		Integer num;
		Hashtable table;
		for (int i = 0; i < occ.length - 2; i++)
		{
			diTag	= new DiTag(concatemer.subString(occ[i], occ[i + 1] + 4));
			
			table	= diTag.isBad() ? badDiTags : diTags;
			
			num		= (Integer)table.get(diTag);
			
			//System.out.println(diTag + " " + diTag.hashCode() + " " + num);
			table.put(diTag, new Integer(num == null ? 1 : num.intValue() + 1));
		}
 

akira

Bekanntes Mitglied
Du hast nicht die Methode

Code:
public boolean equals(Object o)

überschrieben, sondern eine weitere quals-Methode mit einem anderen Parameter geschrieben (Stichwort: Polymorphie).
Ändere die Methode mal wie folgt ab, dann sollte es klappen:

Code:
public boolean equals(Object other)
{
       
        return other instanceof GenString &&  this.toString().equals(other.toString());
}
 

ugh_bough

Mitglied
Boah shit, was fürn Anfängerfehler. Ich hab mich schon gewundert, denn ich mach den Scheiss mit Eclipse und dort wird ja eigentlich was angezeigt, wenn man ne Methode überschreibt. Ich probier das gleich mal aus. Danke schon mal. Ich sag noch bescheid wenns klappt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Zwei Hashtables statt einer? Allgemeine Java-Themen 6
M Vererbung von Hashtables Allgemeine Java-Themen 5
T HashCode korrekt Allgemeine Java-Themen 7
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M hashCode() Allgemeine Java-Themen 3
A HashCode von DatagrammPacket(content) erzeugen. Allgemeine Java-Themen 3
N hashCode() für zwei ints Allgemeine Java-Themen 5
C hashCode() Allgemeine Java-Themen 2
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
hdi Wahrscheinlichkeitsfrage bei hashCode() mit modulo Allgemeine Java-Themen 7
Guybrush Threepwood HashCode-Generierung Allgemeine Java-Themen 4
G hashCode() == Speicheradresse? => warum nur int? Allgemeine Java-Themen 28
X hashCode() Berechnung Allgemeine Java-Themen 5
M hashCode Allgemeine Java-Themen 9
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
T hashCode() erzeugen. Allgemeine Java-Themen 11
T eine Frage zu hashCode() Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben