"gleich gleich" oder equals

Status
Nicht offen für weitere Antworten.
U

usija

Gast
hallo,

wann muss ich bei objekten eigentlich den == operator benutzen bzw. wann equals.

wenn ich ein objekt hab das null ist und ich prüfen möchte muss ich == nehmen (das hab ich durch trial & error festgestellt), da mir equals(null) eine Null-Pointer Exception liefert

was ich so gelesen hab, prüft == ob es sich bei den zu vergleichenden objekten um die selbe referenz handelt. sprich ob die objekte wirklich identisch sind(speicheradresse).

gibts es daher nur 1 null objekt ? wenn ich ein objekt null setze und es auf null prüfe(mit ==), dann ergibt das ja eine wahre aussage.

aus der vorlesung hab ich "aufgeschnappt"(nicht wirklich verstanden) das java feststellt wenn mehrere objekte erzeugt werden sollen, die gleich sind und dann das objekt nur einmal erstellt und einfach alle variablen auf das selbe objekt zeigen lässt.

seh ich das richtig?
 
S

SlaterB

Gast
> wenn ich ein objekt null setze und es auf null prüfe(mit ==), dann ergibt das ja eine wahre aussage.

jo

> gibts es daher nur 1 null objekt ?

das ist mehr eine philosophische Frage und wegen obigen 'jo' irrelevant

> prüft == ob es sich bei den zu vergleichenden objekten um die selbe referenz handelt.

jo, wobei die Objekte ja nunmal Objekte sind,
aber die Variablen sind Referenzen auf Objekte und es wird nur geprüft, ob diese Referenzen dieselben sind


> das java feststellt wenn mehrere objekte erzeugt werden sollen, die gleich sind und dann das objekt nur einmal erstellt und einfach alle variablen auf das selbe objekt zeigen lässt.

nein, das klingt sehr falsch,

für die Ausnahme String mag das so sein:
String a = "ee";
String b = "ee";
// testweise mit == und equals vergleichen
dafür sorgt der Compiler beim Umsetzen dieser Sonder-Syntax

für
Integer c = Integer.valueOf(2);
Integer d = Integer.valueOf(2);
auch noch, Integer-Objekte werden (für kleine ints) gecacht, das sieht man schon halb an der Notation

aber im allgemeinen für 99.99999% aller Klassen sind
Person x = new Person("nach","oben");
Person y = new Person("nach","oben");
zwei unterschiedliche Objekte gleichen Inhalts, daher braucht man equals, == reicht nicht
 

Janus

Bekanntes Mitglied
wann muss ich bei objekten eigentlich den == operator benutzen bzw. wann equals.
- ==, wenn du auf identität prüfen willst, equals, wenn du auf inhaltliche gleichheit prüfen möchtest. in 95% aller fälle möchte man bei objekten equals verwenden

wenn ich ein objekt hab das null ist und ich prüfen möchte muss ich == nehmen (das hab ich durch trial & error festgestellt), da mir equals(null) eine Null-Pointer Exception liefert
- weil an objekten, die null sind, keine methoden aufrufen darfst/kannst

was ich so gelesen hab, prüft == ob es sich bei den zu vergleichenden objekten um die selbe referenz handelt. sprich ob die objekte wirklich identisch sind(speicheradresse).
- genau

gibts es daher nur 1 null objekt ? wenn ich ein objekt null setze und es auf null prüfe(mit ==), dann ergibt das ja eine wahre aussage.
- könnte man so sehen

aus der vorlesung hab ich "aufgeschnappt"(nicht wirklich verstanden) das java feststellt wenn mehrere objekte erzeugt werden sollen, die gleich sind und dann das objekt nur einmal erstellt und einfach alle variablen auf das selbe objekt zeigen lässt.
- wenn java das so macht (weiss ich nicht), dann allerdings transparent für den coder. es wäre tödlich, wenn der java compiler einfach mal so zwei unterschiedlich erzeugten objekten dieselbe identität verpasst. das muss schon auseinandergehalten werden können. wie das ganze gerümpel intern verwaltet wird, ist davon allerdings unabhängig.
 
G

Guest

Gast
Janus hat gesagt.:
aus der vorlesung hab ich "aufgeschnappt"(nicht wirklich verstanden) das java feststellt wenn mehrere objekte erzeugt werden sollen, die gleich sind und dann das objekt nur einmal erstellt und einfach alle variablen auf das selbe objekt zeigen lässt.
Das stimmt so sicher nicht (ausser ich hab nen oargen Brainbug)!
Also bei einem String-Objekt schon, aber nur wenn du es mit einem Literal instanziertst, sprich:
Code:
String s = "blub";
String a= "blub";
--> Es gibt im Speicher nur ein "blub" Literal auf welches dann beide Objekte zeigen, deshalb ist folgendes auch beides true:
Code:
s == a
s.equals(a)

Ansonsten wird schon jedes Objekt für sich erzeugt.
 

Wolfram

Mitglied
== null und der Vergleich von Referenzen ist ein Überrest der Zeigerarithmetik von C/C++.


== null:

Wenn eine Referenz auf kein Objekt "zeigt", setzt man sie null. Nun kann man von "keinem Objekt" natürlich keine Methode aufrufen, deshalb kann man für sowas keine Methode isNull schreiben, um auf diesen Fall abzuprüfen:

Code:
Object o = null;
if ( o.isNull() ) { ... }  // geht nicht!

Deshalb muss dieser Fall auf eine andere Art abgeprüft werden. Einige Programmiersprachen definieren eine Funktion dafür, isNull(), in Java und vielen anderen Programmiersprachen benutzt man == null.


Referenzvergleich:

Ich zäume es mal von hinten auf, ich verstehe sowas aus Maschinensicht immer viel leichter. (Achtung: Das folgende ist nur mehr ein Modell).

Eine Referenz ist quasi nur ein "Zeiger" in einen Speicherbereich. Stell Dir Deinen Speicher, in dem Deine Objekte abgelegt werden, als riesiges Array von x Gigabyte Größe vor. Dann ist ein Zeiger ist ein Index in diesem Array. Eine Referenz ist ein Zeiger, der grundsätzlich auf ein Objekt im Speicher zeigt, oder auf den Index 0 (null). In Java gibt es nur Referenzen, keine Zeiger, d.h. ein Java-Zeiger muss immer auf ein Objekt zeigen.

Wenn Du zwei Referenzen hast, die auf die gleiche Speicherstelle zeigen, ist auch das, was dort steht, also der "Wert" des Objektes gleich. Der Vergleich A == B tut dann, was man denken würde, die "Objekte sind gleich".

Aber:

Wenn Du zwei Referenzen hast, die auf unterschiedliche Speicherstellen zeigen, ist nicht gesichert, dass die Werte, die dort stehen, auch ungleich sind! Der Vergleich A == B vergleicht nur die Referenzen, nicht die Inhalte!

Deshalb brauchst Du, wenn Du wissen willst, ob die Inhalte gleich oder unterschiedlich sind, .equals.


Code:
   byte speicher[] = { 1, 2, 3, 1, 2 3 };
   int zeiger1 = 1, zeiger2 = 4;

   ...
      // entspricht ==
      ... zeiger1 == zeiger2 ...

      // entspricht .equals
      ... speicher[zeiger1] != speicher[zeiger2] ...
 
S

SlaterB

Gast
> Der Vergleich A == B tut dann, was man denken würde, die "Objekte sind gleich".

das ist doch irreführed bis falsch,
gleich sind zwei unterschiedliche Dinge mit gleichen (oder denselben ;) ) Inhalt,
wenn man ein Ding ändert, dann sind sie nicht mehr gleich

aus A == B folgt aber, dass die beiden Objekte ein und dasselbe sind,
wenn man eins ändert, dann das andere auch, denn es ist ja nur eins

die Referenzen sind gleich (zwei unterschiedliche Referenzen gleichen Wertes), zeigen aber auf dasselbe Objekt
 

Wolfram

Mitglied
SlaterB hat gesagt.:
> Der Vergleich A == B tut dann, was man denken würde, die "Objekte sind gleich".

das ist doch irreführed bis falsch,
gleich sind zwei unterschiedliche Dinge mit gleichen (oder denselben ;) ) Inhalt,
wenn man ein Ding ändert, dann sind sie nicht mehr gleich

aus A == B folgt aber, dass die beiden Objekte ein und dasselbe sind,
wenn man eins ändert, dann das andere auch, denn es ist ja nur eins

die Referenzen sind gleich (zwei unterschiedliche Referenzen gleichen Wertes), zeigen aber auf dasselbe Objekt

Ah natürlich, ich gehöre zu den Menschen, die ständig "das gleiche" und "das selbe" durcheinander bringen, aber damit kann man Referenzen natürlich auch super erklären. Bleibt die Frage - versteht das außer Dir dann noch wer? ;)

Ich wollte nur die Maschinensicht noch schnell unterbringen, im Sinne der möglichst vielen Zugänge zu einem Thema.
 
S

SlaterB

Gast
wenn man erst deins liest, dann bestimmt, falls man danach noch genauer drüber nachdenken will ;)

zur Ergänzung:
bei primitiven Variablen hat man keine 'dieselben' Einheiten, deren Werte sind immer unterschiedliche Dinge (Speicherstellen),
da sorgt == für einen Gleichheitstest
(im Grunde genau gleich wie bei den Objekten, da dort ja die Referenzen immer unterschiedliche Dinge sind (Speicherstellen) und deren Wert verglichen wird)
 
U

usija

Gast
hier mal der code einer methode die ein objekt aus einem array entfernt.

dort prüfe ich mit "==" ob mein "suchobjekt" mit einem key-wert übereinstimmt.

Code:
	/**
	 * Löscht ein Objekt aus der Tabelle.
	 * @param key Suchbegriff des Objektes, das gelöscht werden soll
	 * @return old Objekt das gelöscht wurde
	 */
	public Object remove(Object key)
	{
		Object old=null;
		/*Alle Elemente durchlaufen und prüfen ob es ein Objekt gibt,
		 * das dem übergebenen Schlüssel entspricht */ 
		for (int i=0; i < size; i++)
			if (data[i].getKey() == key) //Key des Elements entspricht Suchschlüssel
			{
				old = data[i].getValue(); //alten Wert sichern
				for (int j=i+1; j < size; j++, i++)
					data[i] = data[j];
				// Positionszähler dekrementieren
				size--;
				break;
			}
		
		return old;
	}

die schlüsselbegriff sind in diesem beispiel text-strings. und das funktioniert deswegen weil es eben literale sind, sehe ich das richtig? besser wäre es mit equals arbeiten?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Klassen Warum ist (a.equals(b)) gleich (a==b)? Java Basics - Anfänger-Themen 13
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
K Mail senden, nachdem Anwendung beendet wurde (gleich wie) Java Basics - Anfänger-Themen 4
S Arbeitsfeld in gleich große Bereiche einteilen Java Basics - Anfänger-Themen 2
U zwei 2D arrays auf gleich sein überprüfen Java Basics - Anfänger-Themen 14
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
P String größer kleiner gleich vergleichen Java Basics - Anfänger-Themen 6
S Problem: Array alle Einträge gleich Java Basics - Anfänger-Themen 10
R getrennte Objekte aus Klasse erstellen : warum Inhalt dann gleich ? Java Basics - Anfänger-Themen 2
S Groß- und Kleinbuchstaben gleich behandeln Java Basics - Anfänger-Themen 3
F String length nicht gleich der Ausgabe Java Basics - Anfänger-Themen 10
J JTable Wert gleich überschreiben Java Basics - Anfänger-Themen 6
P OOP Testen ob 2 Strings gleich sind Java Basics - Anfänger-Themen 8
F Doppeltes Gleich? Java Basics - Anfänger-Themen 8
GadgetSofa .txt Datei erstellen und gleich wieder Löschen? Java Basics - Anfänger-Themen 12
K Variablen Instanzen gleich aber warum ? Java Basics - Anfänger-Themen 3
B Threads Geschwindigkeit der Befehle auf verschiedenen PCs gleich machen Java Basics - Anfänger-Themen 3
O Objekte gleich oder verschieden? Java Basics - Anfänger-Themen 14
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
turmaline String teilen in gleich große strings Java Basics - Anfänger-Themen 15
D Strings sind ungleich obwohl sie in der Ausgabe gleich sind Java Basics - Anfänger-Themen 10
B Methoden Mein erstes Programm - und gleich Probleme Java Basics - Anfänger-Themen 6
D X Werte in ArrayList von Point Objekte alle gleich ? Java Basics - Anfänger-Themen 11
D Warum ist int a = 3*2+1*3; gleich 9 und nicht gleich 27 Java Basics - Anfänger-Themen 4
F While Schleife ausführen, wenn String gleich ist. Java Basics - Anfänger-Themen 2
M Problem mit größer oder gleich >= Java Basics - Anfänger-Themen 8
lumo warum double nicht gleich double ist??? Java Basics - Anfänger-Themen 5
feuervogel Datentypen Zwei Sets sind gleich, aber dann doch nicht Java Basics - Anfänger-Themen 9
T Border Layout alle mittleren felder gleich groß Java Basics - Anfänger-Themen 3
A [gelöst]Zwei Ausgaben, die eigentlich gleich sein sollten Java Basics - Anfänger-Themen 9
T .split(";") nicht gleich große arrays werden erzeu Java Basics - Anfänger-Themen 2
-horn- Mathe: Variable gleich Infinity, wie mit if rausfiltern? Java Basics - Anfänger-Themen 9
J Java plus exe gleich Java Basics - Anfänger-Themen 6
D Inhalt eines Dialogfeldes wird nicht gleich angezeigt? Java Basics - Anfänger-Themen 6
M Variablennamen als Parameter gleich Var. als Klassenvariable Java Basics - Anfänger-Themen 2
N long geteilt durch long gleich null ? Java Basics - Anfänger-Themen 8
G testen ob int gleich null Java Basics - Anfänger-Themen 15
G int gleich long ? Java Basics - Anfänger-Themen 2
J JLabel gleich in einer Schriftfarbe anzeigen Java Basics - Anfänger-Themen 4
L Bedingung immer false, auch wenn zwei Strings gleich sind Java Basics - Anfänger-Themen 11
S Bilder gleich am Start zeichnen. Java Basics - Anfänger-Themen 15
R Ist ! gleich false? Java Basics - Anfänger-Themen 3
L int und double auf gleich prüfen? Java Basics - Anfänger-Themen 12
M Imagegroesse angeblich immer gleich 0 Java Basics - Anfänger-Themen 2
X bei ArrayListen in einer ArrayList werden alle gleich befüll Java Basics - Anfänger-Themen 6
V Eingabe gleich als char Java Basics - Anfänger-Themen 3
B Zufallszahlen erzeugen die nicht gleich sind ;/ Java Basics - Anfänger-Themen 10
Silver-Blue Random aus ArrayList immer gleich Java Basics - Anfänger-Themen 9
R in einer TextArea den Cursor gleich anzeigen lassen 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
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

Ähnliche Java Themen

Neue Themen


Oben