kann mir jemand erklären, wofür (und wann) ich die hashcode-Methode brauche
public class Name {
private String value;
public Name(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Name nameA = new Name("Hansi");
Name nameB = new Name("Hansi");
nameA == nameB; // false
nameA.equals(nameB); // false
if (nameA.getValue().equals(nameB.getValue())) {
// ...
}
equals]
:public class Name {
private String value;
public Name(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public boolean equals(Object other) {
// TODO Check "other" type.
return value.equals(other.value);
}
}
hashCode
:public class Name {
private String value;
public Name(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public boolean equals(Object other) {
// TODO Check "other" type.
return value.equals(other.value);
}
@Override
public void int hashCode() {
return value.hashCode();
}
}
equals
und hashCode
direkt vor, oder das Kapitel dazu in "Effective Java", wenn du Buecher magst.Die Methode equals() muss bestimmte Voraussetzungen erfüllen: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)Noch eine ergänzende Frage: Die equals-Methode (wie auch hashcode) funktioniert in verschiedenen Schritten, die ich aber bei eclipse nicht selber schreiben muss weil mir eclipse das abnimmt!?
Das stimmt nicht, die Default equals Methode ist (quasi) äquivalent zu dem == Operator und hashCode ist ein fester Wert, der bei der Objekterzeugung mehr oder minder zufällig erzeugt wird. Klassen-Variablen werden dabei nicht berücksichtigt!Eclipse erstelle keine Equals Methode, es existiert eine vorhandene, welche sämtliche Klassenvariablen berücksichtigt. Gleiches gilt für die Hashcode-Methode.
public boolean equals(Object obj) {
return (this == obj);
}
EINSPRUCH EUER EHRENist ein fester Wert, der bei der Objekterzeugung mehr oder minder zufällig erzeugt wird.
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Das ist für die Klasse String der Fall, wo es explizit programmiert wurde, aber nicht allgemeingültig. Das ist nicht die Standard-HashCode Implementierung von Object, sonder explizit für String.EINSPRUCH EUER EHREN
bei string wurde die methode überschrieben und berechnet den wert anch der formel![]()
W3Schools.com
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.www.w3schools.com
Hmm, ok. Da hab ich wohl etwas zu weit gegriffen / was durcheinandergebracht.Das stimmt nicht, die Default equals Methode ist (quasi) äquivalent zu dem == Operator und hashCode ist ein fester Wert, der bei der Objekterzeugung mehr oder minder zufällig erzeugt wird. Klassen-Variablen werden dabei nicht berücksichtigt!
[/code]
Dann solltest du das auch sagen. Ich hab in meinem Beitrag auf die Default-Methode hingewiesen und du hast da Einspruch eingelegt. Das ist was anderes als zu sagen, dass es bei String anders ist (und übrigens noch bei zig anderen Klassen aus dem JDK)das wollte ich ja sagen dass es bei string ein spezialfall gibt..
bedanktDie Methode equals() muss bestimmte Voraussetzungen erfüllen: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
IDEs bieten meist ein Template dafür an, das man nutzen kann, aber nicht muss.