Christian Fein
Erfahrenes Mitglied
Ok hier die Auflösung:
korrekt ist true. Zwar stimmt es das == auf Objectgleicheit prüft und nicht auf Wertgleichheit. Aber dadurch das dies 2 Konstante Strings sind die sich nicht verändern sind beide die Referenz auf das selbe Object.
Die VM geht beim Instanzieren vollgendermassen vor:
("EinString" ist String a =="EinString" ist String b)
Der String "EinString" wird erkannt, es wird in einem StringKonstantenPool nach diesem String gesucht, ist er nicht vorhanden so wird ein String mit dem Inhalt "EinString" im Stringkonstantenpool erstellt und die Referenz zurückgegeben. Beim String b wird ebenso im Strinkonstantenpool nach dem Vorkommen des Strings gesucht und gefunden, dabei wird die Referenz auf den String zurückgegeben. Deshalb ist "EinString"=="EinString".
Wieso sind die beiden Konstant?
Strings sind unveränderlich, wenn eine Methode eines Strings aufgerufen wird, so geben diese Immer einen neuen String zurück. Der eigentliche String bleibt bestehen bis er vom GC eingesammelt wird.
Hier sind zwar auch 2 Konstanten im Spiel die jeweils dem Konstruktor übergeben werden, daber das schlüsselwort new erstellt explizit, einen neuen String weshalb
korrekt == false.
equals() ist die Methode der Wahl wenn es darum geht 2 Strings miteinander zu vergleichen. Sprich ob sie die selben Werte haben.
equals() geht follgendermassen vor:
Es prüft erst ob die beiden Strings == vergleichbar sind, sind sie es dann gibt die Methode true zurück. Sind sie es nicht, vergleicht die Methode die länge des Strings, und dann falls true, jeden einzelnen char miteinander. Auch hier sind 2 Konstanten im Spiel weshalb equals() true schon beim == vergleich zurückgibt.
Siehe C, gibt auch true zurücl, aber es muss mehr getestet werden da der Test == fehlschlägt.
Methode C) ist bei 100.000 die schnellste, was auf die Optimierungen der JVM zurückzuführen ist. Wie genau optimiert, und weshalb bei 1.000.000 die Methode A) schneller ist hat mir noch keiner genau sagen können
Code:
A)
for(int i = 0; i < 100000; i++)
korrekt = ("EinString"=="EinString");
korrekt ist true. Zwar stimmt es das == auf Objectgleicheit prüft und nicht auf Wertgleichheit. Aber dadurch das dies 2 Konstante Strings sind die sich nicht verändern sind beide die Referenz auf das selbe Object.
Die VM geht beim Instanzieren vollgendermassen vor:
("EinString" ist String a =="EinString" ist String b)
Der String "EinString" wird erkannt, es wird in einem StringKonstantenPool nach diesem String gesucht, ist er nicht vorhanden so wird ein String mit dem Inhalt "EinString" im Stringkonstantenpool erstellt und die Referenz zurückgegeben. Beim String b wird ebenso im Strinkonstantenpool nach dem Vorkommen des Strings gesucht und gefunden, dabei wird die Referenz auf den String zurückgegeben. Deshalb ist "EinString"=="EinString".
Wieso sind die beiden Konstant?
Strings sind unveränderlich, wenn eine Methode eines Strings aufgerufen wird, so geben diese Immer einen neuen String zurück. Der eigentliche String bleibt bestehen bis er vom GC eingesammelt wird.
Code:
B)
for(int i = 0; i < 100000; i++)
korrekt = (new String("EinString")==new String("EinString"));
korrekt == false.
Code:
C)
for(int i = 0; i < 100000; i++)
korrekt = "EinString".equals("EinString");
equals() geht follgendermassen vor:
Es prüft erst ob die beiden Strings == vergleichbar sind, sind sie es dann gibt die Methode true zurück. Sind sie es nicht, vergleicht die Methode die länge des Strings, und dann falls true, jeden einzelnen char miteinander. Auch hier sind 2 Konstanten im Spiel weshalb equals() true schon beim == vergleich zurückgibt.
Code:
D)
for(int i = 0; i < 100000; i++)
korrekt = new String("EinString").equals("EinString");
Siehe C, gibt auch true zurücl, aber es muss mehr getestet werden da der Test == fehlschlägt.
Methode C) ist bei 100.000 die schnellste, was auf die Optimierungen der JVM zurückzuführen ist. Wie genau optimiert, und weshalb bei 1.000.000 die Methode A) schneller ist hat mir noch keiner genau sagen können