equals() der Klasse Objects liefert unerwartetes Ergebnis

Status
Nicht offen für weitere Antworten.

bertrand

Neues Mitglied
Bei nachfolgendem Code erwarte ich als Ergebnis false. Es ist aber true. Wieso?

Meine Überlegungen:
Ich caste die Instanzen der Klasse String zu Instanzen der Klasse Objects um. Und die Methode equals() der Klasse Objects überprüft bekanntlich nur, ob die beiden Referenzen, die am Vergleich beteiligt sind, auf das gleiche Objekt zeigen. Bei zwei unterschiedlichen Objekten mit gleichem Inhalt (und dies ist bei meinem Beispiel der Fall) sollte diese Methode immer false zurückgeben.

Code:
public class Test {

	public static void main(String[] args) {
		String giga = new String ("megagiga");
		String gigb = new String ("megagiga");
		System.out.println((Object)giga.equals((Object)gigb));
		
	}

}

Danke für die Antworten.
 

SebiB90

Top Contributor
auch wenn du castet und so tust als ob die Strings objecte wären,sind sie ja auch da extends Object, bleiben sie immer noch instanzen von der Klasse String und dort ist nunmal ne andere equals() methode
 
L

Leroy42

Gast
Was Bleiglanz und Sebib90 geschrieben haben, ist selbstverständlich richtig.
Der OP hatte aber noch eine weitere Frage:

Bei zwei unterschiedlichen Objekten mit gleichem Inhalt (und dies ist bei meinem Beispiel der Fall) sollte diese Methode immer false zurückgeben.

Beide Stringvariablen verweisen auf dasselbe Element. Es gibt also nur
ein Objekt. Dies liegt daran, daß Java (JVM?) einen Stringpool verwaltet und,
da Strings ja immutable sind, der Compiler smart genug ist, nur ein Stringobjekt
anzulegen auf das beide Referenzen verweisen
 

Sky

Top Contributor
Leroy42 hat gesagt.:
Beide Stringvariablen verweisen auf dasselbe Element. Es gibt also nur
ein Objekt. Dies liegt daran, daß Java (JVM?) einen Stringpool verwaltet und,
da Strings ja immutable sind, der Compiler smart genug ist, nur ein Stringobjekt
anzulegen auf das beide Referenzen verweisen

Wenn ich mich recht entsinne, gilt dies doch nur für
Code:
String giga = "megagiga"; 
String gigb = "megagiga";
Bei 'new' wird doch explizit ein neues Objekt angelegt.
 
B

Beni

Gast
Bei zwei unterschiedlichen Objekten mit gleichem Inhalt (und dies ist bei meinem Beispiel der Fall) sollte diese Methode immer false zurückgeben.
Du meinst true? Die Methode drueckt Gleichheit aus (nach was man die auch immer berechnen moechte).
 
L

Leroy42

Gast
Ich dachte immer, das läge bei Strings nicht im Ermessen des Compilers?

Ich habe beide Varianten mal decompilieren lassen und bei der
Version mit new() wird tatsächlich zweimal der Konstruktor
von String aufgerufen :shock:

Hat jemand einen Link auf die entsprechende Spezifikation?
 

Bleiglanz

Gesperrter Benutzer
"new X() != new X()"

muss immer erfüllt sein! Deshalb ignoriert Java bei "new String" den Stringpool

BTW: new String("irgendwas") ist IMHO schon fast ein Fehler, es gibt überhaupt keinen Grund, den Konstruktor "public String(String)" von String jemals zu verwenden...
 

flanker

Aktives Mitglied
Eigentlich ist der Kostruktor new String(String str) nur zum kopieren da, daher ist diese durchaus brauchbar.
Beispiel:
Code:
String s1 = "Hello";
String s2 = new String(s1);
s2 += " world!";
 

Bleiglanz

Gesperrter Benutzer
völliger Unsinn, weil String immutable sind ist
Code:
String s1 = "Hello";
String s2 = s1;
//* hier ist ein Unterschied!
s2 += " world!";
genauso gut

brauchbar wäre der nur, wenn man in Zeile4 unbedingt s1!=s2 erzwingen will, aber wozu sollte das gut sein?
 

flanker

Aktives Mitglied
OK, noch ein Beispiel:
(nur wegen völliger Unsinn)

Du hast eine komplexe Routine(r1) angestossen, die als Ergebnis ein String (s1) liefert.
s1 dient als Ausgangsbasis für weitere Routinen (r2, r3,...rn) und modifizieren das Ergebnis des r1;
Nun meine Frage: Willst du für jede Routine s1 neu berechnen? natürlich nicht oder?
also eine Kopie des s1 verwenden mit new String(s1)
 

Bleiglanz

Gesperrter Benutzer
ein String kann nicht modifiziert werden!

Merke: von unveränderlichen Objekten (String, Integer) braucht man keine Kopien machen!
 

SnooP

Top Contributor
Aber ich find den Satz aus der API lustig:
"Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable."

Wieso ist das ne Begründung? ;) wenn Strings immutable sind, wird doch eh eine Kopie des Strings durch die literale Zuweisung erzeugt s2 = s1; ... dann ist das doch keine Begründung mit expliziter Kopie - es sei denn tatsächlich man will s1 != s2 erzwingen - aber ich kann mir keine Situation vorstellen wo man das ernsthaft in Erwägung ziehen müsste ;) ... Insofern klingt der Satz nach ner fadenscheinigen Begründung um den Konstruktor vor einem @deprecated zu retten :D
 

flanker

Aktives Mitglied
So sieht die Sun-Implementierung des Konstruktors aus:

Code:
public String(String original) {

  int size = original.count;
  char[] originalValue = original.value;
  char[] v;

  if (originalValue.length > size) {
    
    // The array representing the String is bigger than the new
    // String itself.  Perhaps this constructor is being called
    // in order to trim the baggage, so make a copy of the array.
    v = new char[size];
    System.arraycopy(originalValue, original.offset, v, 0, size);
  } else {
    // The array representing the String is the same
    // size as the String, so no point in making a copy.
    v = originalValue;
  }

  this.offset = 0;
  this.count = size;
  this.value = v;
}
 
B

Beni

Gast
SnooP hat gesagt.:
wird doch eh eine Kopie des Strings durch die literale Zuweisung erzeugt s2 = s1;
Ne, eine Zuweisung generiert keine Kopie. Wäre ja noch schöner, wie schnell wäre der Speicher da wohl verbraucht :wink:

Also wo man konkret eine Kopie benötigt, weiss ich jetzt auch nicht ???:L
 

bertrand

Neues Mitglied
Hehe, ist beruhigend zu sehen, dass Anfängerfragen soviel Diskussionsstoff bieten. Aber danke für eure interessanten Ausführungen, obwohl ich nicht sehr viel verstehe ...

:D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
J Klassen Warum ist (a.equals(b)) gleich (a==b)? Java Basics - Anfänger-Themen 13
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