Seit wann kann eine Klasse Methoden überschreiben ?Niki hat gesagt.:...von der Klasse Buchstaben überschreiben
Niki hat gesagt.:... der Klasse Buchstaben überschreiben
hashcode ist fuer die contains irrelevant - da wird nix gehasht...Niki hat gesagt.:Ja, jedoch solltest du die equals und hashCode Methoden von der Klasse Buchstaben überschreiben
public BuchstabeMitAnzahl(Character c, int haeufigkeit) {
this.c = c;
this.haeufigkeit = haeufigkeit;
}
public Character getC() {
return c;
}
public void setC(Character c) {
this.c = c;
}
public int getHaeufigkeit() {
return haeufigkeit;
}
public void setHaeufigkeit(int haeufigkeit) {
this.haeufigkeit = haeufigkeit;
}
deathbyaclown hat gesagt.:hashcode ist fuer die contains irrelevant - da wird nix gehasht...Niki hat gesagt.:Ja, jedoch solltest du die equals und hashCode Methoden von der Klasse Buchstaben überschreiben
equals reicht
deathbyaclown hat gesagt.:jaja - sollte man... dennoch ist die hashCode fuer contains irrelevant.
also...
damit es funktioniert - equals(Object o) ueberschreiben und true zurueckgeben wenn die objekte gleich sind (als zb gleicher Character und gleiche Haeufigkeit).
fuer den fleissheitspreis und eine stolzen brust alles blitzeblanko gemacht zu haben - auch noch die hashCode ueberschreiben
ray30002 hat gesagt.:Geht also doch nicht?
public int hashCode() {
return c.hashCode()
}
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.
Wildcard hat gesagt.:Nein, das stimmt so nicht.
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.
Kann das mal jemand genau übersetzen?SlaterB hat gesagt.:und das kleine Schwarze ist die Ausnahme
Murray hat gesagt.:...ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert
class Integer
{
private int i;
public void equals(Object other)
{
// cast, instanceof etc
return this.i == otherInteger.i;
}
public int hashCode()
{
return i;
}
void set(int x)
{
this.i = x;
}
}
ray30002 hat gesagt.:Joaaahhh... gut Oehmmm ich mach dat dann ma so irgendwie...
tfa hat gesagt.:Wenn jeder Buchstabe in deinem Vector nur einmal auftreten kann, nimm lieber eine HashMap statt eines
Vector. Das könnte die Sache beschleunigen.
Marco13 hat gesagt.:provided no information used in equals comparisons on the object is modified.
==
vorausgesetzt, dass keine Information, die in equals-Vergleichen des Objektes verwendet wird, wird geändert
Und das ist etwas anderes als
...ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert[/qoute]
Ich muss sagen, dass hier gerade mein Weltbild schwankt.
Allerdings ist dein Beispiel nicht vollständig, Ich habe es mal ausforumuliertund ein HashSet damit gefüttert:Code:public class MutableInt { private int i; public MutableInt(int value) { i = value; } public int get() { return i; } public void set(int i) { this.i = i; } @Override public boolean equals(Object other) { if (other instanceof MutableInt) { MutableInt otherInteger = (MutableInt)other; return this.i == otherInteger.i; } return false; } @Override public int hashCode() { return i; } @Override public String toString() { return this.getClass().getName() + "[value=" + get() + ']'; } }
Teste es und sage mir, was du davon hältst.Code:import java.util.HashSet; public class MutIntTest { private static MutableInt m1 = new MutableInt(1); private static MutableInt m2 = new MutableInt(2); private static MutableInt m3 = new MutableInt(1); private static HashSet<MutableInt> set = new HashSet<MutableInt>(); public static void main(String[] args) { set.add(m1); System.out.println("-------------- Vorher ---------------"); print(); m1.set(2); System.out.println("-------------- Nachher ---------------"); print(); System.out.println("-------------- Inhalt vom Set ---------------"); for (MutableInt m : set) { System.out.println("m.equals(m1)\t" + m.equals(m1)); System.out.println("m.equals(m2)\t" + m.equals(m2)); System.out.println("m.equals(m3)\t" + m.equals(m3)); System.out.println("\t" + m + "\tHash: " + m.hashCode() + "\tim Set: " + set.contains(m)); } } private static void print() { System.out.println("m1.equals(m2)\t" + m1.equals(m2)); System.out.println("m1.equals(m3)\t" + m1.equals(m3)); System.out.println("m2.equals(m3)\t" + m2.equals(m3)); System.out.println("#1\t" + m1 + "\tHash: " + m1.hashCode() + "\tim Set: " + set.contains(m1)); System.out.println("#2\t" + m2 + "\tHash: " + m2.hashCode() + "\tim Set: " + set.contains(m2)); System.out.println("#3\t" + m3 + "\tHash: " + m3.hashCode() + "\tim Set: " + set.contains(m3)); System.out.println(); } }
Vielleicht auf dem Papier. In der Praxis halte ich es jedoch nach wie vor für gefährlich, equals/hashCode und Veränderlichkeit zu kombinieren.[...]Damit ist der Vertrag also erfüllt.
....
set.add(m1);
System.out.println("-------------- Vorher ---------------");
print();
set.remove(m1); // !!!
m1.set(2);
set.add(m1); // !!!
System.out.println("-------------- Nachher ---------------");
print();