Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Weshalb erzeugen die beiden ZeilenSystem.out.println(hashMap.size());sowie die beiden Zeilen System.out.println(hashMap.get(new ...)); aus der main-Methode nicht je zwei Mal die gleiche Ausgabe?
Java:
import java.util.HashMap;
public class HashCodeBeispiel {
public static void main(String[] args) {
HashMap<Object,Object>
hashMap = new HashMap<Object,Object>();
hashMap.put(new StringWrapperSchlecht("A"), "X");
hashMap.put(new StringWrapperSchlecht("A"), "Y");
System.out.println(hashMap.size());
System.out.println(hashMap.get(new StringWrapperSchlecht("A")));
hashMap.clear();
hashMap.put(new StringWrapper("A"), "X");
hashMap.put(new StringWrapper("A"), "Y");
System.out.println(hashMap.get(new StringWrapper("A")));
System.out.println(hashMap.size());
}
}
class StringWrapperSchlecht {
String string;
StringWrapperSchlecht(String str)
{
string = str;
}
@Override public boolean equals(Object ob) {
if (ob == null || getClass() != ob.getClass())
{
return false;
}
return string.equals(((StringWrapperSchlecht) ob).string);
}
}
class StringWrapper {
String string;
StringWrapper(String str)
{
string = str;
}
@Override public boolean equals(Object ob)
{
if (ob == null || getClass() != ob.getClass())
{
return false;
}
return string.equals(((StringWrapper) ob).string);
}
@Override public int hashCode()
{
super.hashCode();
return 101 * string.hashCode();
}
}
Ich nehme an das es so ist, weil in der class StringWrapper die Methode public int hashCode() aufgerufen wird und die Methode public int hashCode() über schrieben wird?
Also:
return string.equals(((StringWrapperSchlecht) ob).string); liefert null da dort kein Wert ist?
Bedeutet return string.equals(((StringWrapperSchlecht) ob).string); das es als String zurück gegeben wird?
Weshalb erzeugen die beiden ZeilenSystem.out.println(hashMap.size());sowie die beiden Zeilen System.out.println(hashMap.get(new ...)); aus der main-Methode nicht je zwei Mal die gleiche Ausgabe?
Das ist mir schon klar, aber sollte es bei der zweiten Ausgabe, also nach hashMap.clear(); nicht die gleiche Ausgabe wie vor dem clear() Methode sein?
Ich erhalte foglendes:
2 -> für System.out.println(hashMap.size());
null -> für System.out.println(hashMap.get(new StringWrapperSchlecht("A")));
Y -> für System.out.println(hashMap.get(new StringWrapper("A")));
1 -> für System.out.println(hashMap.size());
"null" wird ja von der Klasse StringWrapperSchlecht - return string.equals(((StringWrapperSchlecht) ob).string); zurückgegeben. Wieso ist das so?
StringWrapperSchlecht implementiert die hashCode()-Methode nicht. Jedes dieser Objekte hat also einen anderen Hashcode. Daher wird auch nichts gefunden, wenn man diese als Schlüssel verwendet.
In einer HashMap werden ja Schlüssel/Wert-Paare gespeichert. Die hashCode()-Methode ist nicht implementiert. Dadurch hat jedes der eingefügten Objekte einen anderen Hashcode. Daher wird auch nichts gefunden, wenn man den HashCode als Schlüssel für equals? verwendet.
Oder habe ich was falsch verstanden?
Danke für deine Hilfe tfa
equals alleine reicht nicht. Wenn du die Map mit get(obj) abfragst, wird zuerst der Hashcode von obj ausgerechnet. Dann wird nachgeschaut, ob an ein oder mehrere Objekte mit diesem Hashcode vorhanden sind. Wenn nein ist die Sache erledigt und es wird null zurück geliefert (was hier höchstwahrscheinlich der Fall ist). Falls ja, werden alle gefundenen Objekte mit equals() auf Gleichheit überprüft.
Also, dank deiner Hilfe habe ich folgendes verstanden:
In einer HashMap werden Schlüssel/Wert-Paare gespeichert. Die hashCode()-Methode ist in der Klasse "StringWrapperSchlecht" nicht implementiert. Dadurch hat jedes der eingefügten Objekte einen anderen Hashcode. Wenn die Map mit get(obj) abgefragt wird, wird zuerst der Hashcode von obj ausgerechnet. Dann wird nachgeschaut, ob an ein oder mehrere Objekte mit diesem Hashcode vorhanden sind. Wenn nein ist die Sache erledigt und es wird null zurück geliefert (was hier höchstwahrscheinlich der Fall ist). Falls ja, werden alle gefundenen Objekte mit equals() auf Gleichheit überprüft.