Java- Referenzen?

Wie ja jeder weiss, werden in Java Strings mit der equals Methode auf Gleichheit überprüft, aber bei folgendem Konstrukt sieht es anders aus:
public class Test {
public static void main(String[] args) {
String s1=„hallo“;
String s2=„hallo“;
System.out.println(s1+" = „+s2+“ ist „+ (s1==s2));
s2=„nicht hallo“;
System.out.println(s1+“ = „+s2+“ ist "+ (s1==s2));
}
}

Es ist in der esten Abfrage (s1==s2) = true.
(Dies ist nicht der Fall, wird s2 mit
String s2= new String(„hallo“);
deklariert.

Wie und warum kommt es zu diesem Vergleichsergebnis??

Moin

Du hast eine Optimierung des Compilers aus dem 1.4.0 SDK gefunden. Um Speicherplatz zu sparen legt er den String nur 1x an. Das ist an sich auch kein Problem, das Ding ist Threadsafe und kann nicht verändert werden.

> String s1="hallo";  
> String s2="hallo";

entspricht also nach der Compiler-Optimierung:

 String temp\_Compiler = "hallo"
 String s1=temp\_Compiler;
 String s2=temp\_Compiler;

Es ist in der esten Abfrage (s1==s2) = true.
(Dies ist nicht der Fall, wird s2 mit
String s2= new String(„hallo“);
deklariert.

Falsch, denn:

public class Test {
 public static void main(String[] args) {
 String s1 = new String("hallo");
 String s2 = new String("hallo");
 System.out.println(s1+" = "+s2+" ist "+ (s1==s2));
 }
}

gibt false aus. Daraus macht der Compiler:

 String temp\_Compiler = "hallo"
 String s1 = new String(temp\_Compiler);
 String s2 = new String(temp\_Compiler);

wobei durch das „new String“ tatsächlich ein neuer String erstellt wird. (kann man mit dem Code auch testen, wenn man selbst die Variable einführt)

Wie und warum kommt es zu diesem Vergleichsergebnis??

wenns noch nicht klar ist, poste nochmal.

cu

Danke, sowas in etwa hatte ich mir schon gedacht. Weisst Du zufällig, ob das von SUN o.ä. dokumentiert ist???

Danke, sowas in etwa hatte ich mir schon gedacht. Weisst Du
zufällig, ob das von SUN o.ä. dokumentiert ist???

Die JVM hält intern einen „literal pool“ und ich glaube dies ist nicht erst seit 1.4.0 so:

http://www.precisejava.com/javaperf/j2se/StringAndSt…

schau mal hier gibts einen Abschnitt „How the JVM works with Strings:“ da ist das ganz gut beschrieben

Grüße
Bruno

Moin

http://www.precisejava.com/javaperf/j2se/StringAndSt…

schau mal hier gibts einen Abschnitt „How the JVM works with
Strings:“ da ist das ganz gut beschrieben

Wobei ich von der benutzung von .intern() absehen würde.

  1. wenn es viele Strings in der JVM gibt wird die Methode langsam. ±O(log(n))

  2. Hashtable (und Set) wird dir was husten wenn du als key’s String’s benutzt und zufälligerweise 2 gleiche dabei sind.

cu

  1. wenn es viele Strings in der JVM gibt wird die Methode
    langsam. ±O(log(n))

Naja so schlecht ist das doch nicht :wink: log(n) wird bei großem n ja nur unwesentlich langsamer

  1. Hashtable (und Set) wird dir was husten wenn du als key’s
    String’s benutzt und zufälligerweise 2 gleiche dabei sind.

inwiefern?

Grüße
Bruno

Moin

inwiefern?

Je nach Implementierung (die M$-JVM für win9x) hält das die Ding die Key’s nicht mehr auseinander und der String wird nur 1x gespeichert.

cu