FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Praktische Informatik

Java-Fragen: Objekte-equals, Strings, ..

Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:22
Connor
aus der Buchklasse:
public String toString()
{
return ("" + autor + ": " + titel + " ("
+ this.dateToString(this.getErscheinungsdatum()) + ", ISBN "
+ iSBN + ")");
}

public boolean equals(Object o)
{

return (this.toString() == o.toString());
}

warum kommt dann wenn ich buch1 mit den gleichen werten wie buch2 fütter, das buch1.equals(buch2) false liefert?

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:25
guiltyguy
Weil du equals ein Object o übergibst, so dass der Aufruf o.toString nicht deine toString Klasse aufruft, sondern die der Klasse Object…

Probier mal so:

public boolean equals(Object o)
{
Buch vergleich;
vergleich = (Buch) o;
return (this.toString() == vergleich.toString());
}

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:27
Anonymer User
Weil == Referenzen vergleicht.

Also:
Bei Buch a = new Buch();
Buch b = a;
liefert Dein equals true, da a und b auf "das selbe Objekt im Speicher" verweisen.

Aber
Buch a = new Buch();
Buch b = new Buch();

haben verschiedene Referenzen.

{
Buch oo = (Buch)o;
return oo.getTitel().equals(this.getTitel() && oo.getAutor().equals(this.getAutor()) && …


Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:32
Connor
aber die haben die gleiche string representation und ich vergleiche hier strings

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:32
guiltyguy
Weil == Referenzen vergleicht.

Also:
Bei Buch a = new Buch();
Buch b = a;
liefert Dein equals true, da a und b auf "das selbe Objekt im Speicher" verweisen.

Aber
Buch a = new Buch();
Buch b = new Buch();

haben verschiedene Referenzen.

{
Buch oo = (Buch)o;
return oo.getTitel().equals(this.getTitel() && oo.getAutor().equals(this.getAutor()) && …


Stimmt, das kommt auch noch dazu, das sollte man dann aber auch mit einem equals der toString Funktion erledigen können, denke ich:

public boolean equals(Object o)
{
Buch vergleich;
vergleich = (Buch) o;
return (this.toString().equals(vergleich.toString()));
}

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:33
guiltyguy
aber die haben die gleiche string representation und ich vergleiche hier strings

Ja, aber Strings vergleicht man mit equals und nciht mit == in Java!

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:38
Connor
public boolean equals(Object o)
{
Buch vergleich;
vergleich = (Buch) o;
return (this.toString().equals(vergleich.toString()));
}

kommt aber auch nicht false bei raus…

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:40
guiltyguy
public boolean equals(Object o)
{
Buch vergleich;
vergleich = (Buch) o;
return (this.toString().equals(vergleich.toString()));
}

kommt aber auch nicht false bei raus…

Ich dachte du wolltest auch 2 gleiche Objekte vergleichen, dann soll doch nicht false rauskommen?

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:42
Connor
streiche das nicht tt


Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:44
Anonymer User
aber die haben die gleiche string representation und ich vergleiche hier strings

Ja, aber Strings vergleicht man mit equals und nciht mit == in Java!

Noch als Anmerkung/Unterstreichung
== vergleicht bei allen Objekten (String ist auch ein Objekt) "nur" die Referenzen. Will man also Wissen, ob zwei Objekte "sachlich" gleich sind aber verschiedenen "Geburtsort" haben, sollte man equals nutzen.
toString.equals würde natürlich auch gehen, aber damit koppeltst Du die Gleichheit Deiner Objekte an die toString Repräsentation, was vielleicht nicht immer glücklich ist.

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:45
Slater
Weil du equals ein Object o übergibst, so dass der Aufruf o.toString nicht deine toString Klasse aufruft, sondern die der Klasse Object…
das stimmt übrigens nicht, es wird immer die Operation der Unterklasse gerufen

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:48
Connor
public boolean equals(Object o)
{
Buch vergleich;
vergleich = (Buch) o;
//String s1 = this.toString();
//String s2 = vergleich.toString();
String s1 = "Test";
String s2 = "Test";
boolean vergl = (s1.equals(s2));
System.out.println(vergl);
return vergl;

}

Es kommt wegen assertionFailedError zu keinen System output

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:51
guiltyguy
public boolean equals(Object o)
{
Buch vergleich;
vergleich = (Buch) o;
//String s1 = this.toString();
//String s2 = vergleich.toString();
String s1 = "Test";
String s2 = "Test";
boolean vergl = (s1.equals(s2));
System.out.println(vergl);
return vergl;

}

Es kommt wegen assertionFailedError zu keinen System output

println kann wahrscheinlich nur Strings ausgeben, try:
if (vergl)
{System.out.println("true");}
else
{System.out.println("false");}

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:54
Connor
autsch ich nehm alles zurück. wenn ich natürlich die falsche klasse teste…

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:57
guiltyguy
autsch ich nehm alles zurück. wenn ich natürlich die falsche klasse teste…

;)

und welche Version funktioniert jetzt?

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 10:59
Anonymer User
println kann man alles übergeben.

assertionError kommt von JUnit.
Sobald JUnit erkennt, daß der Test (assertTrue(…)) nicht true liefert, bricht er ab. Setze Dein println vor das assertTrue (mit dem Testcode) oder bastel Dir ne kleine Main-Klasse zum testen. Das wirst Du das Ergebnis sehen.

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 11:00
Connor
string1.equals(string2) geht ich hab nur warteschlange getestet und da muss ich die equals funktion noch für schreiben

Re: Java-Fragen: Objekte-equals, Strings, .. 2005-11-11 11:54
Brokkoli
println kann wahrscheinlich nur Strings ausgeben

stimmt nicht - println kommt mit Strings und allen Primitiven Datentypen zurecht. Auch mit anderen Objekten funktionierts, aber da wird dann nur das ergebnis von toString() ausgegeben.