Warum gibst hier Equals false zurück ?

Bullz

Mitglied
hallo, ;) vielleicht kleine Vorstellung. Bin neu hier und arbeite mich gerade in Java ein. Mir ist nicht klar wie folgender Ausdruck false sein kann ...

Java:
public class Typen {
    
    public static void main(String[] args) {
        
        Cabrio a = new Cabrio("abc"); 
        Cabrio b = new Cabrio("abc");
        
        System.out.println(a.equals(b));  // sollte doch true sein ist es aber nicht.
        System.out.println(a==b);         // Referenzen werden verglichen und das ist in der Tat false

System.out.println(a==b); ist doch deswegen false da sie auf verschiedene Referenzen zeigen ?? Denk ich mir jedenfalls. Ach ja die equals Methode habe ich natürlich nicht überschrieben :rtfm:
 
Zuletzt bearbeitet:

Bullz

Mitglied
Java:
package com.video2brain.java7.autos.fahrzeuge;

/**
 *
 * @author Michael Kulla (mkulla@gmx.de)
 */
public class Cabrio extends Auto {

    private boolean dachOffen;

    public Cabrio() {
        this("anonymes Cabrio");
    }

    public Cabrio(String name) {
        this(false, name);
    }

    public Cabrio(boolean dachOffen, String name) {
        super(name);
        this.dachOffen = dachOffen;
    }

    public void öffneDach() {
        if (!dachOffen) {
            System.out.println("Dach wird geöffnet.");
            dachOffen = true;
        }
    }

    public void schließeDach() {
        if (dachOffen) {
            System.out.println("Dach wird geschlossen.");
        }
        dachOffen = false;
    }

    @Override
    public String toString() {
        return super.toString() + " und das DAch ist " + (dachOffen ? "offen" : "geschlossen");
    }
}

package com.video2brain.java7.autos;

import com.video2brain.java7.autos.fahrzeuge.Auto;
import com.video2brain.java7.autos.fahrzeuge.Cabrio;

/**
 *
 * @author admin
 */
public class Typen {
    
    public static void main(String[] args) {
        
        Cabrio a = new Cabrio("abc"); 
        Cabrio b = new Cabrio("abc");
        
        System.out.println(a.equals(b));  // sollte doch true sein ?
        System.out.println(a==b);         // ist false und mir auch klar warum

sry wollte nicht so großen Text Blöcke spammen ... da kriegt man in anderen Foren immer eine auf den Decken. Schätze hier in den programmier Foren wird man da nachsichtiger sein :D
 

Bullz

Mitglied
Java:
package com.video2brain.java7.autos.fahrzeuge;

public class Auto {

    private int geschwindigkeit;
    private String name;

    public Auto(int geschwindigkeit, String name) {
        this.geschwindigkeit = geschwindigkeit;
        this.name = name;
    }
    
    public Auto(String name) {
        this(0, name);
    }

    public Auto() {
        this("anonym");
    }
    
    public void beschleunigen() {
        geschwindigkeit = geschwindigkeit + 1;
    }

    public void bremsen() {
        geschwindigkeit = geschwindigkeit - 1;
        if (geschwindigkeit < 0) {
            geschwindigkeit = 0;
        }
    }
    
    public void anhalten() {
        while (geschwindigkeit > 0) {
            bremsen();
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public int getGeschwindigkeit() {
        return geschwindigkeit;
    }
    @Override
    public String toString() {
        return name + " fährt gerade " + geschwindigkeit + " km/h";
    }
    
    public void hupen(int anzahl) {
        for (int i = 0; i < anzahl; i++) {
            System.out.print("Hup ");
        }
        System.out.println();
    }
}

uffa dachte ich bin so blöd weil es mir komisch vorkam. Anscheinend ist es das auch ;)
 

Mujahiddin

Top Contributor
Wenn du zwei Objekte erzeugst, sind das zwei verschiedene Objekte. Sie sind zwar identisch, aber nicht ein und das selbe Objekt.
Deshalb kannst du auch nicht mit == überprüfen, denn das wird immer false liefern, außer du machst sowas:
Java:
Cabrio a = new Cabrio("abc");
Cabrio b = a;
System.out.println(a == b); // true

Die Methode equals aus der Klasse Object gibt einfach nur [c]this == other[/c] zurück, also ist bei Klassen, die equals nicht überschreiben, von Bedeutung, welche Referenz sie haben.
Du müsstest also die equals-Methode überschreiben. Eclipse hat da ein nettes Feature, welches automatisch equals-Methoden implementiert.
 

Shadoka

Mitglied
Du kannst ja mal testweise die toString()-Methode auskommentieren und dann beide Autos nochmal auf der Konsole ausgeben lassen. Dann siehst du, dass die Autos unterschiedlich referenziert werden im Speicher.
 
G

Gast2

Gast
Mujahiddin hat gesagt.:
Sie sind zwar identisch, aber nicht ein und das selbe Objekt.
Sie sind zwar gleich, aber nicht ein und das selbe Objekt.
Ein kleiner aber feiner Unterschied :)

@TO:
Du musst in Auto equals überschreiben und die Attribute die du vergleich willst dort prüfen. Falls du keine Ahnung hast wie man die equals Methode implementieren muss, dann schau dir dazu auf jedenfall ein paar Beispiele an, das ist nicht trivial.
 

Bullz

Mitglied
Bei Objekten ist also ist (a==b) das gleiche wie (a.equals(b)) ... aha verstanden.

Komischerweise funktioniert es bei Strings ... jedenfalls bei mir.

Dachte das equals den Wert der in der Speicherzelle geschrieben ist vergleicht... so wie bei String ... :oops:
 
Zuletzt bearbeitet:
G

Gast2

Gast
Bei Objekten ist also ist (a==b) das gleiche wie (a.equals(b)) ... aha verstanden.
Nene, das ist ganz falsch!
Wenn deine Klasse equals nicht überschreibt, dann greift die Implementierung von Object, und die vergleicht simpel per == (was soll die auch sonst machen?
In der Regel überschreibt ne Klasse aber die equals Methode, wie String bspw. auch.
 

Bullz

Mitglied
ihr redet von Überladung oder ? Das Methoden vor allem die implementiert sind so schlau sind und alles fressen können und das wenn ich Strings mit equals vergleiche equals anderes funktioniert als wenn ich Objekte vergleiche ?
 

Mujahiddin

Top Contributor
Nein, nicht Überladung.
Jede Klasse erbt von Object.
Object hat die equals Implementierung
Code:
return this == other;
Wenn deine Klasse von einer anderen Klasse erbt, dann wird jedes Mal, wenn auf ein Objekt deiner Klasse equals aufgerufen wird, die Hierarchie nach oben abgetastet, bis eine Klasse gefunden wird, die equals überschreibt. In deinem Fall ist das Object. Bei String ist das String (also die Klasse selbst.)
Du kannst aber equals überschreiben. Somit wird nicht mehr die Methode von oben (Object) genommen, sondern deine eigene Methode.
Du kannst dir ja mal String#equals ansehen.
 

Pentalon

Bekanntes Mitglied
Der Vergleich wir mit der Methode Equals durchgeführt. Wenn diese nicht den Anforderungen angepasst ist, vergleicht sie einfach die Adresse (also die Referenzen) der Objekte und die sind nicht gleich. Du musst nur die Methode equals so anpassen, dass sie den Vergleich macht und dann mit True oder False antwortet.

Pentalon
 

Bullz

Mitglied
Nein, nicht Überladung.
Jede Klasse erbt von Object.
Object hat die equals Implementierung
Code:
return this == other;
Wenn deine Klasse von einer anderen Klasse erbt, dann wird jedes Mal, wenn auf ein Objekt deiner Klasse equals aufgerufen wird, die Hierarchie nach oben abgetastet, bis eine Klasse gefunden wird, die equals überschreibt. In deinem Fall ist das Object. Bei String ist das String (also die Klasse selbst.)
Du kannst aber equals überschreiben. Somit wird nicht mehr die Methode von oben (Object) genommen, sondern deine eigene Methode.
Du kannst dir ja mal String#equals ansehen.

okay jetzt hab ichs glaub ich gecheckt. Objekt ist die Basisklassen aller Klassen das oberste und dort drin ist equals mit return this == other ausgeführt.

okay wenn ich die Dokumentation sieht man das für Strings das Ding anderes funktioniert wie für Objekte ... auch wenn ihr es anderes ausdrücken würdest ... :rtfm:

public boolean equals(Object anObject)
Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.
Overrides:
equals in class Object
Parameters:
anObject - The object to compare this String against
Returns:
true if the given object represents a String equivalent to this string, false otherwise


public boolean equals(Object obj)
Indicates whether some other object is "equal to" this one.
The equals method implements an equivalence relation on non-null object references:
...
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

Parameters:
obj - the reference object with which to compare.
Returns:
true if this object is the same as the obj argument; false otherwise.
 
Zuletzt bearbeitet:

Pentalon

Bekanntes Mitglied
Du müsstest nur z.B. in Deiner Klasse Auto, eine Methode equals machen.

Java:
    public boolean equals(Auto that) {
        	return this.name == that.name;    		
    }
    
    public static void main(String[] args) {
    
    	Auto Auto1 = new Auto("Golf");
    	Auto Auto2 = new Auto("Golf");
    	
    	System.out.println("Vergleichen der Autos ergibt "+Auto1.equals(Auto2));
    } 
}

Damit legst Du fest, wie der Vergleich zu erfolgen hat und dann kommt auch das erwartete TRUE :)

Pentalon
 
Zuletzt bearbeitet:

Mujahiddin

Top Contributor
Du müsstest nur z.B. in Deiner Klasse Auto, eine Methode equals machen.

Java:
    public boolean equals(Auto that) {
        	return this.name == that.name;    		
    }
    
    public static void main(String[] args) {
    
    	Auto Auto1 = new Auto("Golf");
    	Auto Auto2 = new Auto("Golf");
    	
    	System.out.println("Vergleichen der Autos ergibt "+Auto1.equals(Auto2));
    } 
}

Damit legst Du fest, wie der Vergleich zu erfolgen hat und dann kommt auch das erwartete TRUE :)

Pentalon

Falsch.
eher mit
Code:
return this.name.equals(other/*that klingt komisch*/.name);
 

Crian

Top Contributor
Außerdem sind equals-Methoden i.d.R. etwas komplexer. Sie behandeln null und testen auf gleiche Klasse, bevor sie die EMember vergleichen.

Wer equals überschreibt, sollte auch hashCode überschreiben.

IDEs wie etwa Eclipse können beides erledigen.
 

Pentalon

Bekanntes Mitglied
Alles klar...

So ungefähr :)

Java:
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Auto other = (Auto) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

Danke liebes Eclipse....

Ob dass hier leichter zu verstehen ist, als der 3-Zeiler der natürlich nicht ganz korrekt war, sei mal dahingestellt.

Pentalon
 
Zuletzt bearbeitet:

Mujahiddin

Top Contributor
Java:
public boolean equals(Auto other) {
            return (other != null && this.name.equals(other.name));          
    }

Es muss Object sein (wie bygones bereits sagte).

So was (Eclipse-generiert):
Java:
@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ( ( name == null ) ? 0 : name.hashCode() );
	return result;
}

@Override
public boolean equals(Object obj) {
	if( this == obj )
		return true;
	if( obj == null )
		return false;
	if( !( obj instanceof Auto ) )
		return false;
	Auto other = (Auto) obj;
	if( name == null ) {
		if( other.name != null )
			return false;
	} else if( !name.equals( other.name ) )
		return false;
	return true;
}
 
H

hüteüberhüte

Gast
Wer equals überschreibt, sollte auch hashCode überschreiben.

Ne, wenn hashCode() nicht benötigt wird, sollte und muss man es nicht überschreiben. Wenn es benötigt wird, sollte man es konform zu equals() überschreiben

@Mujahiddin: Irgendwie scheint es so, als wolltet ihr eine Wissenschaft draus machen :D
 
Zuletzt bearbeitet von einem Moderator:

Mujahiddin

Top Contributor
Ne, wenn hashCode() nicht benötigt wird, sollte und muss man es nicht überschreiben. Wenn es benötigt wird, sollte man es konform zu equals() überschreiben

@Mujahiddin: Irgendwie scheint es so, als wolltet ihr eine Wissenschaft draus machen :D

Naja, sicherheitshalber sollte man wirklich beides überschreiben. Klar, hashCode() wird nicht überall gebraucht, wo equals() gebraucht wird, aber 1. macht das Eclipse sowieso automatisch und 2. geht man so auf Nummer Sicher. Später entscheidet man sich, ne HashMap zu verwenden und fragt sich, warum Objekte darin nicht mehr gefunden werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
D Ist Ableiten hier sinnvoll Java Basics - Anfänger-Themen 5
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
H BlueJ: was genau ist hier der Fehler? Java Basics - Anfänger-Themen 14
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Kann mir jemand hier die Logik vermitteln? Java Basics - Anfänger-Themen 3
M Wie kann ich hier den Abstand ausgeben? Java Basics - Anfänger-Themen 3
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
P Weswegen entstehen hier Syntaxfehler? Java Basics - Anfänger-Themen 3
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
S Was für Aufgaben könnten sich hier hinter verbergen? Java Basics - Anfänger-Themen 5
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
R Wie würde hier die if-Anweisung aussehen? Java Basics - Anfänger-Themen 18
S Operatoren i=i++; Was passiert hier? Java Basics - Anfänger-Themen 21
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
O Was bedeutet das hier 999_983? Java Basics - Anfänger-Themen 2
F Warum ist die Ausgabe hier 1? Java Basics - Anfänger-Themen 4
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
S Unklarer Code (was passiert hier?) Java Basics - Anfänger-Themen 1
R Kann mir hier jemand weiterhelfen? Java Basics - Anfänger-Themen 1
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
B Wieso gibt er hier nur die ungeraden Zahlen aus? Java Basics - Anfänger-Themen 5
B Kann mir jemand erklären, warum hier dreimal was ausgegeben wird und nicht nur zweimal? Java Basics - Anfänger-Themen 16
P Compiler-Fehler Wo befindet sich hier der Fehler und warum? Java Basics - Anfänger-Themen 21
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
K Was wird hier nacheinander gemacht? Java Basics - Anfänger-Themen 1
L [ARRAY] Werden hier die Indezes oder die Werte vergliechen? Java Basics - Anfänger-Themen 4
M Liegt hier bereits ein Bad Smell vor? Java Basics - Anfänger-Themen 9
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
V in diesem Forum wurde mir am meisten geholfen, daher eine Frage die hier nicht passt. sry (VB Frage) Java Basics - Anfänger-Themen 3
T boolean, was passiert hier? Java Basics - Anfänger-Themen 4
O euer chat hier Java Basics - Anfänger-Themen 1
R kann mir jemand erklären was hier gemacht wurde? Java Basics - Anfänger-Themen 10
K Wie übergebe ich hier korrekt die Werte Java Basics - Anfänger-Themen 5
V Warum wird hier 200 ausgeliefert? Java Basics - Anfänger-Themen 39
S Klassen Klasse oder nicht Klasse - das ist hier die Frage Java Basics - Anfänger-Themen 6
W Methoden Wie wird eine Methode hier aufgerufen? Java Basics - Anfänger-Themen 5
S wieso Fehlermeldung cannot find symbol hier Java Basics - Anfänger-Themen 10
K Was ist hier Falsch? Java Basics - Anfänger-Themen 3
L Erste Schritte Sollte ich hier lieber Cases verwenden oder wäre eine If-Bedingung besser? Java Basics - Anfänger-Themen 6
E Kann mir jemand sagen was hier falsch ist? Java Basics - Anfänger-Themen 6
J Was passiert hier? Java Basics - Anfänger-Themen 6
D Wie "unchecked cast" hier vermeiden? Java Basics - Anfänger-Themen 2
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
Q switch case hier möglich Java Basics - Anfänger-Themen 10
P Was ist hier falsch? Java Basics - Anfänger-Themen 6
Luk10 Wo zum Teufel fehlen Hier Klammern? Java Basics - Anfänger-Themen 2
T Was mache ich hier falsch? Java Basics - Anfänger-Themen 3
M Was könnte hier nicht stimmen??? Java Basics - Anfänger-Themen 9
K Warum funktioniert hier die setText methode? Java Basics - Anfänger-Themen 3
S Wie ereuge ich hier am besten eine Schleife Java Basics - Anfänger-Themen 12
K Hier noch ein Konstruktor aufbauen Java Basics - Anfänger-Themen 6
G Welche Datenstruktur ist hier die sinnvolste Java Basics - Anfänger-Themen 6
M warum kompiliert das hier nicht? Java Basics - Anfänger-Themen 3
G Probleme mit break hier; in if-Bedingung Java Basics - Anfänger-Themen 5
S Hallo, ich hab hier ein Buch Java Basics - Anfänger-Themen 11
S Warum wirkt hier synchronized nicht? Java Basics - Anfänger-Themen 9
S Funktion hier sinnvoll ? Java Basics - Anfänger-Themen 4
zilti Was ist hier falsch? Java Basics - Anfänger-Themen 13
S Bot Fragen(hoffe das ist hier richtig) Java Basics - Anfänger-Themen 12
D was stimmt hier nicht? Java Basics - Anfänger-Themen 7
W HTML oder nicht? Das ist hier die Frage. Java Basics - Anfänger-Themen 4
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
K Was ist hier faul? Java Basics - Anfänger-Themen 29
L Was stimmt hier nicht Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
G was ist hier falsch? Java Basics - Anfänger-Themen 5
E Wo liegt hier der Fehler? Java Basics - Anfänger-Themen 13
L wo liegt hier der fehler? Java Basics - Anfänger-Themen 3
C Wie muss man hier aufrufen von 2 eigenen Klassen? Java Basics - Anfänger-Themen 6
J JInternalFrame: Warum funktioniert das hier nicht? Java Basics - Anfänger-Themen 11
P was ist denn hier falsch ? (nur 1Zeile) Java Basics - Anfänger-Themen 21
H Wie hier die Progressbar benutzen? Java Basics - Anfänger-Themen 8
M Was wird hier geprüft? Java Basics - Anfänger-Themen 10
D Was ist hier falsch in der JTable? Java Basics - Anfänger-Themen 5
ven000m Was läuft hier nicht gescheit? Java Basics - Anfänger-Themen 12
megachucky Suche ein paar gute Tutorials so wie dieses hier. Java Basics - Anfänger-Themen 4
3 Verschiedene Fragen (bin neu hier) Java Basics - Anfänger-Themen 5
M Warum rechnet Java hier nicht richtig? Java Basics - Anfänger-Themen 3
H weiss nicht wo hier der fehler liegt Java Basics - Anfänger-Themen 3
J hier Random oder was Einzusetzen Java Basics - Anfänger-Themen 2
A GUI hier, ActionListener da Java Basics - Anfänger-Themen 3
Say Equals Java Basics - Anfänger-Themen 6
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
J compareTo()- und equals-Methode Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben