Klassen Warum ist (a.equals(b)) gleich (a==b)?

Jay Technology

Neues Mitglied
Guten Tag, ich hoffe meine Frage ist hier erwünscht. Ich habe begonnen Java zu lernen und bin bei Klassen und Co. angekommen. Ich habe folgendes gelernt:

Java:
public static void main(String[] args) {
     Auto auto1 = new Auto();
     Auto auto2 = auto1;
}

Wenn ich eine Klasse habe die Auto heißt, dann weiß ich das ich in diesem Beispiel keine zwei Objekte erstelle die den selben Wert haben sondern, dass ich mit auto2 nur einen Zeiger auf auto1 habe. Also wenn ich auto2 verändere, verändere ich eigentlich auto1.

Daraus ergibt sich das (auto1==auto2) immer true liefert, unabhängig deren Variablen-Werten. Da dieses true ja nur angibt das es das selbe Objekt ist.

Nun ist mir bei String etwas aufgefallen:

Java:
public static void main(String[] args) {
     String a = "wert";
     String b = a;

     if(a==b){
          System.out.print(1);
     }

     b = "anders";

     if(a==b){
          System.out.print(1);
     }
}

Das obige Beispiel müsste in der Konsole 2x 1 ausgeben, tut es aber nicht. Nur die erste 1 wird ausgegeben. b müsste doch ein Zeiger auf a sein? so müsste (a==b) immer true liefern da es die selben Objekte sind? Allerdings wird hier bei String anscheinend auf den Wert der Variable geschaut. Denn sobald ich b verändere(wo sich ja eigentlich a verändern müsste, da Zeiger) liefert (a==b) false zurück.

Warum ist das bei der String-Klasse so?

Würde mich freuen wenn sich jemand die Mühe macht mich aufzuklären.
MfG. Jay Tech.
 

Schandro

Top Contributor
Java:
b = "anders";
Durch diese Zeile veränderst du das String-Object nicht. Du erschaffst ein neues String-Object und weist es
Code:
b
zu.
Code:
a
zeigt aber immernoch auf das erste String-Object.
 
Zuletzt bearbeitet:
F

Firephoenix

Gast
Gleiches Verhalten wie hier, dort wird ebenfalls nur einmal 1 ausgegeben:
Java:
public static void main(String[] args) {
	     Object a = new Object();
	     Object b = a;
	 
	     if(a==b){
	          System.out.print(1);
	     }
	 
	     b = new Object();
	 
	     if(a==b){
	          System.out.print(1);
	     }
	}

Zeiger ist in Java übrigens eher ein gefährlicher Begriff, Referenz trifft es besser.

Stell dir Variablen wie Zettel vor. Entweder sie zeigen auf nichts, oder auf die konkrete Instanz eines Objektes das Typkompatibel zu der Variable ist.
Im Beispiel könnte a also auf das Objekt 7150bd4d zeigen.
Jetzt weißt du a b zu und bekommst 2 Zettel die auf 7150bd4d zeigen.
Der vergleich a == b vergleicht jetzt ob beide Variablen auf die gleiche Instanz zeigen (7150bd4d), der Vergleich liefert also true.
Jetzt erzeugst du ein neues Objekt und weißt dieses b zu (dem Zettel a ist es völlig egal was du mit Zettel b anstellst!)
auf a steht jetzt also 7150bd4d und auf b 6bbc4459. Ein erneuter == vergleich schlägt entsprechend Fehl.

Ähnliches Thema und sehr gut erklärt: http://www.java-forum.org/allgemeines/4904-call-value-call-reference.html

Gruß
 
F

Firephoenix

Gast
Die Begriffe werden zum Teil synonym verwendet, aber es besteht durchaus ein Unterschied zwischen einem Wert der einer Speicheradresse zugeordnet wird und einem Wert der auf ein Objekt mit einer Speicheradresse zeigt.
Eine Referenz ist in dem Sinne ein impliziter Zeiger.

Bei einem Pointer kannst du die Speicheradresse zur Laufzeit direkt manipulieren, bei einer Reference kannst du nur das Objekt austauschen und dadurch die Adresse ändern, du hast aber keinen direkten Zugriff auf die Adresse.

Ich denke es passt also nicht gut in Java von einem Zeiger oder Pointer zu reden wie man ihn z.B. aus C++ gewohnt ist.

Gruß
 

Bernd Hohmann

Top Contributor
Strings sehen immer so einfach aus, sind in der Praxis aber schwierig.

Man muss sich merken, dass der einfache Befehl

Code:
 a = "Hallo Welt";

intern als

Code:
 a = new String("Hallo Welt");

gestaltet wird - dann versteht man auch so gewisse Sachen besser.

Bernd
 
H

hüteüberhüte

Gast
Man muss sich merken, dass der einfache Befehl

Code:
 a = "Hallo Welt";

intern als

Code:
 a = new String("Hallo Welt");

gestaltet wird

Oder aus dem String Pool kommt.

@Firephoenix: Glaubs mir, sie werden synonym verwendet, sie bedeuten das gleiche. Lediglich, was man mit Pointer/Zeiger/Referenzen in anderen Sprachen machen kann, ist unterschiedlich
 
F

Firephoenix

Gast
Dann geh doch einfach mal an google und such mal nach Pointer und Reference.
Alternativ die zwei Seiten hier (Die Englischen Versionen sind allerdings besser), oder entsprechende Java-Literatur.

Referenz (Programmierung) ? Wikipedia
Zeiger (Informatik) ? Wikipedia

[OT]Zum Thema Prof weiß es besser:
Bei uns in der Vorlesung war ein Prof. Dr. der Meinung das man while-Schleifen grundsätzlich als
Java:
while(true){
if(abbruchbedingung1)
break;
if(abbruchbedingung2)
break;
//...
}
aufbauen sollte da große Statements im Schleifenkopf zu unübersichtlich werden.
Da könnte man gerade mal von hinten mit Clean Code draufhauen und von vorne nochmal mit "Extract Expression to Method"-Refactoring reinstechen.
(Und später darf man dann mit Leuten zusammenarbeiten die so einen Stil übernehmen...)
[/OT]

[EDIT]@Hüte, im Gegensatz zu deiner Meinung oder der Meinung deines Profs kann ich aber auch Quellen angeben. Ansonsten frei nach dem Schema den ich auch bei Projektgruppen gehe: Wer anderer Meinung ist und belegen kann das seine Meinung besser oder korrekter ist hat recht, da muss sich niemand auf die Schuhe getreten fühlen (manche schaffen es leider nicht immer Fachliches und Persönliches zu trennen ;) )[/EDIT]

Gruß
 
Zuletzt bearbeitet von einem Moderator:
G

gst

Gast
Wie wärs eigentlich mit eigenem Nachdenken und praktischer Erfahrung statt einfach den Unsinn deines Profs nachzuplappern? In deutschen Hörsälen wird in Bezug auf Softwareentwicklung viel Unsinn gelabert, wenn der Tag lang ist.
 
H

hüteüberhüte

Gast
[OT]@Firephoenix: Es ging aber nicht darum, wie programmiert werden sollte, sondern was die exakte Bezeichnung für etwas ist, und im Zweifel glaube ich dann jemanden, der etwas mehr Erfahrung damit hat, mehr als jemanden, der nur wie ein Kleinkind seine Meinung durchsetzen will.

Edit: Das mit der while-Schleife ist gar nicht mal so schlecht. Sicher wird er sich etwas gedacht haben dabei. Das Beispiel ist aber abwägig. und wikipedia... dazu kann jeder etwas schreiben.[/OT]
 
Zuletzt bearbeitet von einem Moderator:

KuhTee

Aktives Mitglied
Ich denke es passt also nicht gut in Java von einem Zeiger oder Pointer zu reden wie man ihn z.B. aus C++ gewohnt ist.
Doch, ich finde, das passt durchaus. Ausser in Low-Level C Programmierung manipuliert man in C und C++ eigentlich NIE die Speicheradresse direkt, sondern geht den Weg den man auch in Java hat, also die schlichte Zuweisung. Und nicht umsonst ist die wichtigste Exception in Java die NullPointerException ;)

Java "Referenzen" sind C++ "Zeigern" viel ähnlicher als C++ "Referenzen" den C++ "Zeigern".

Also der Begriff "Referenz" ist absolut in Ordnung in Java, schließlich ist es die offizielle Bezeichnung. Aber es ist absolut legitim, Java Referenzen mit C++ Zeigern zu vergleichen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U "gleich gleich" oder equals Java Basics - Anfänger-Themen 9
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
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
lallmichnichtzu Methoden Überladen des .equals-Operators Java Basics - Anfänger-Themen 6
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
G Java equals() Methode Java Basics - Anfänger-Themen 9
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
D Unterschied == und equals in Arrays Java Basics - Anfänger-Themen 2
O equals Methode möglichst effizient Java Basics - Anfänger-Themen 13
H equals methode Java Basics - Anfänger-Themen 1
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
E equals Prüfung fehlgeschlagen Java Basics - Anfänger-Themen 3
C Objekt equals Java Basics - Anfänger-Themen 2
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
H equals Methode Java Basics - Anfänger-Themen 1
F String equals NULL Problem Java Basics - Anfänger-Themen 4
D Auf equals von Vaterklasse zugreifen Java Basics - Anfänger-Themen 4
S Methoden equals(object o) / toString Java Basics - Anfänger-Themen 15
E Calender - Equals Problem Java Basics - Anfänger-Themen 14
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals Java Basics - Anfänger-Themen 3
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
S compareTo() und equals() Java Basics - Anfänger-Themen 6
S equals Methode bei String Java Basics - Anfänger-Themen 5
R illegal start of expression - 3 Strings vergleichen mit .equals () Java Basics - Anfänger-Themen 5
K Cast bei equals Java Basics - Anfänger-Themen 2
T SQL equals Java Basics - Anfänger-Themen 4
OnDemand Methoden Equals Methde Java Basics - Anfänger-Themen 3
D if block mit equals im rumpf Java Basics - Anfänger-Themen 11
K Vererbung equals-Methode bei Vererbung abstrakter Klassen Java Basics - Anfänger-Themen 8
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
K String - Equals Java Basics - Anfänger-Themen 2
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
S Verständnissfrage equals() Java Basics - Anfänger-Themen 2
R compareTo & equals Java Basics - Anfänger-Themen 10
M Verschiedene Möglichkeiten mit 'equals' abdecken? Java Basics - Anfänger-Themen 9
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
W Stringvergleich mit equals Java Basics - Anfänger-Themen 13
C equals() Java Basics - Anfänger-Themen 4
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
T Problem mit der while(!string.equals("x")) Java Basics - Anfänger-Themen 2
E Equals-Methode auf Class-Object Java Basics - Anfänger-Themen 17
X problem mit equals.gelöst Java Basics - Anfänger-Themen 2
J Methode equals() Java Basics - Anfänger-Themen 7
M Equals überschreiben Java Basics - Anfänger-Themen 3
K equals() und hashcode() überschreiben Java Basics - Anfänger-Themen 5
K equals in Hashmap() Java Basics - Anfänger-Themen 4
B if equals(irgendeine Zahl+Buchstabe) Java Basics - Anfänger-Themen 6
T equals() und hashCode() Java Basics - Anfänger-Themen 7
D probs mit clone und equals Java Basics - Anfänger-Themen 10
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
N Vergleich per equals Java Basics - Anfänger-Themen 5
S comparable und equals Java Basics - Anfänger-Themen 7
M Frage zu Textvergleich (equals) Java Basics - Anfänger-Themen 8
G Strings vergleichen mit equals, geht das kürzer? Java Basics - Anfänger-Themen 4
B Frage zu Funktion mit equals Java Basics - Anfänger-Themen 17
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
D "2010–03–12".equals( "2010-03-12" ) Java Basics - Anfänger-Themen 6
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
T Problem mit equals Java Basics - Anfänger-Themen 5
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
S equals vergleich Java Basics - Anfänger-Themen 10
H Equals hascode Java Basics - Anfänger-Themen 5
S Equals Downcast? Java Basics - Anfänger-Themen 11
D equals Vergleiche Java Basics - Anfänger-Themen 7
L String mit equals vergleichen Java Basics - Anfänger-Themen 6
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
F String equals null wird nicht angenommen. Java Basics - Anfänger-Themen 24
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
P Toleranz bei equals Java Basics - Anfänger-Themen 4
B Frage zu equals() und hashCode() Java Basics - Anfänger-Themen 28
A veränderbar kanonische Klassen: Methode equals, hashcode, serializable Java Basics - Anfänger-Themen 5
D String#equals + String#charAt Java Basics - Anfänger-Themen 5
S equals() - hashCode() - Contract Java Basics - Anfänger-Themen 54
G mehrere Werte für .equals ? Java Basics - Anfänger-Themen 22
T [SOLVED] Java String equals funktioniert nicht Java Basics - Anfänger-Themen 5
C 2 Objekte (mathematisch) vergleichen in der equals Methode Java Basics - Anfänger-Themen 10
B String.equals(Object) anstatt "=" Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben