# identität vs gleichheit



## Guest (6. Feb 2008)

hey,
eigentlich dachte ich, ich verstehe den unterschied. laut meinem skript:

== vergleicht auf identität, d.h. gleiche speicherstelle im hauptspeicher (bei objekten jetzt).
equals vergleicht auch gleichheit, also ob z.B. das herz ass gleich der herz 9 ist (braucht also je nach anwendung auch ein override)

so, jetzt aber:

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

System.out.println(s1 == s2)

ergibt: TRUE

warum denn das? ich dachte, man soll Stringsmit equals vergleichen, wieso ergibt nun aber auch mit == true?
Strings sind doch eigentlich auch (halb-)Objekte in Java oder? Und sie sind nicht veränderbar, d.h. er müsste doch für s1 und s2 zwei Objekte im Hauptspeicer angelegt haben.
Aber dann müsste die Identität (==) doch false sein?

Wieso ist es aber bei Strings nicht so?


----------



## maki (6. Feb 2008)

Strings sind echte Objekte in Java, nix halbes.

Allerdings werden String vom Compiler extrem optimiert, wenn zB in einer Klasse 2mal das gleiche String literal gefunden wird:

```
String eins = "test";
String zwei = "test";
```
optimiert der Comiler so, dass es nur ein einziges String Objekt mit dem Wert "test" gibt.

Hast dir leider ein schlechtes Beispiel ausgesucht für deinen Test 

Anders ist es natürlich wenn die Strings erst zur Laufzeit erzeugt werden, zB über Konsoleneingaben


----------



## Pappenheimer++ (6. Feb 2008)

guck mal, das hier gibt false:

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


----------



## JavaFred (6. Feb 2008)

maki hat gesagt.:
			
		

> Anders ist es natürlich wenn die Strings erst zur Laufzeit erzeugt werden


Exakt! Man betrachte z.B. den folgenden Code:


```
public static void test()
{
    String s = "hallo hallo";
    String[] a = s.split(" ");
    System.out.println(a[0]);
    System.out.println(a[1]);
    System.out.println(a[0] == a[1]);
    System.out.println(a[0].equals(a[1]));
}
```

Das Programm produziert die folgende Ausgabe:

hallo
hallo
false
true


----------



## maki (6. Feb 2008)

Pappenheimer, 

so erzeugt man doch keine Strings in Java, zumindest ist es unüblich, denn es werden 2 Strings pro Zeile erzeugt und die tollen Compiler Optimierungen sind nicht anwendbar 

anstatt:

```
String s1=new String("hy");
```
sollte es so lauten:

```
String s1 = "hy";
```
Der Compiler macht aus "hy" schon einen String, das new sorgt dafür das dann zur Laufzeit noch einer erzeugt wird... nicht das wahre.
Hilft vielleicht beim Testen, sollte man sich aber auf gar keinen Fall angewöhnen, schlechter Stil.


----------



## Leroy42 (6. Feb 2008)

Ich denke nicht, daß Pappenheimer das selbst so schreibt.

Er wollte doch nur ein Beispiel geben, wo == ein false liefert.


----------



## maki (6. Feb 2008)

> Ich denke nicht, daß Pappenheimer das selbst so schreibt.


Will ich auch hoffen


----------



## Pappenheimer++ (6. Feb 2008)

Lol was hättet ihr denn gedacht?^^


----------



## Wildcard (6. Feb 2008)

equals ist total aus der Mode. Die Sache geht so:

```
public class Test
{
   
      public static void main (String args[])
      {
         String s1=new String("hy");
         String s2=new String("hy");
         System.out.println(s1.intern()==s2.intern());
      }
}
```
 :wink:


----------



## Giftstachel (7. Feb 2008)

hui... das klingt interessant, mit dem intern(). hast da auf die schnelle auch nen link dazu?


----------



## Marco13 (7. Feb 2008)

Beachte das " :wink: " hinter Wildcard's Post  :meld: 

Ansonsten...
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#intern()

Aber insbesondere hier
http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html 
den Abschnitt "3.10.5 String Literals" (fast ganz unten)


----------



## Giftstachel (7. Feb 2008)

danke


----------

