S
Spacerat
Gast
Hallo...
Ich bin zwar kein Anfänger mehr, poste mein Anliegen aber mal hier, damits auch die gleich mitbekommen können...
Mein Anliegen ist folgendes:[highlight=java]
public boolean equals(Object obj)
{
if(obj == this) return true;
/* try {
Vertex v = (Vertex) obj;
boolean rc = true;
for(int n = 0; n < d.length && rc; n++) rc &= v.d[n] == d[n];
return rc;
} catch(ClassCastException e) {
return false;
}*/
if(obj == null) return false;
if(obj instanceof Vertex) {
Vertex v = (Vertex) obj;
boolean rc = true;
for(int n = 0; n < d.length && rc; n++) rc &= v.d[n] == d[n];
return rc;
}
return false;
}
public int hashCode()
{
return toString().hashCode();
}
public String toString()
{
return "X: " + d[0] + "; Y: " + d[1] + "; Z: " + d[2];
}[/highlight]Wie langjährige Forennutzer wissen stehe ich mit folgendem auf "Kriegsfuss":
Wenn man "equals()" überschreibt, sollte man auch "hashCode()" überschreiben, und zwar so, das inhaltlich gleiche Instanzen den selben Hash erhalten.
In meiner Klasse gibts allerdings ein winziges Problem: Da es sich bei meiner Klasse um eine Klasse handelt ("Vertex" -> in etwa Point3D) die in 3D-Anwendungen exessiv verwendet wird, ist es unvermeidlich, das inhaltlich verschiedene Vertices den selben Hash erhalten (logisch: Es können ja 3x soviele Instanzen existieren, wie Hashcodes zur Verfügung stehen). Aufgefallen ist mir dies, als sich eine rein logisch implementierte "equals()"-Methode[highlight=java]public boolean equals(Object object)
{
if(this == object) return true;
if(object == null) return false;
if(object instanceof Vertex) return hashCode() == object.hashCode();
return false;
}[/highlight]als grausam FATAL erwies. Welche Bewandnis hat es also mit diesem Contract? Wenn man hier also nur "equals()" überschreibt, kann die Klasse doch immer noch (wenn auch nicht so exessiv, lediglich das 1. Drittel aller möglichen Instanzen) in einer HashMap, -Table und oder -Set verwendet werden, oder sehe ich das falsch?
Ich bin zwar kein Anfänger mehr, poste mein Anliegen aber mal hier, damits auch die gleich mitbekommen können...
Mein Anliegen ist folgendes:[highlight=java]
public boolean equals(Object obj)
{
if(obj == this) return true;
/* try {
Vertex v = (Vertex) obj;
boolean rc = true;
for(int n = 0; n < d.length && rc; n++) rc &= v.d[n] == d[n];
return rc;
} catch(ClassCastException e) {
return false;
}*/
if(obj == null) return false;
if(obj instanceof Vertex) {
Vertex v = (Vertex) obj;
boolean rc = true;
for(int n = 0; n < d.length && rc; n++) rc &= v.d[n] == d[n];
return rc;
}
return false;
}
public int hashCode()
{
return toString().hashCode();
}
public String toString()
{
return "X: " + d[0] + "; Y: " + d[1] + "; Z: " + d[2];
}[/highlight]Wie langjährige Forennutzer wissen stehe ich mit folgendem auf "Kriegsfuss":
Wenn man "equals()" überschreibt, sollte man auch "hashCode()" überschreiben, und zwar so, das inhaltlich gleiche Instanzen den selben Hash erhalten.
In meiner Klasse gibts allerdings ein winziges Problem: Da es sich bei meiner Klasse um eine Klasse handelt ("Vertex" -> in etwa Point3D) die in 3D-Anwendungen exessiv verwendet wird, ist es unvermeidlich, das inhaltlich verschiedene Vertices den selben Hash erhalten (logisch: Es können ja 3x soviele Instanzen existieren, wie Hashcodes zur Verfügung stehen). Aufgefallen ist mir dies, als sich eine rein logisch implementierte "equals()"-Methode[highlight=java]public boolean equals(Object object)
{
if(this == object) return true;
if(object == null) return false;
if(object instanceof Vertex) return hashCode() == object.hashCode();
return false;
}[/highlight]als grausam FATAL erwies. Welche Bewandnis hat es also mit diesem Contract? Wenn man hier also nur "equals()" überschreibt, kann die Klasse doch immer noch (wenn auch nicht so exessiv, lediglich das 1. Drittel aller möglichen Instanzen) in einer HashMap, -Table und oder -Set verwendet werden, oder sehe ich das falsch?
Zuletzt bearbeitet von einem Moderator: