Zeichenkette: Unterschied zwischen den Versionen

Aus EINI
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „Eine '''Zeichenkette''', oder auch aus dem Englischen '''String''', ist eine Folge von Zeichen und Symbolen. Als solche werden sie in den meisten Programmiersp…“)
 
 
(9 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Eine '''Zeichenkette''', oder auch aus dem Englischen '''String''', ist eine Folge von Zeichen und Symbolen. Als solche werden sie in den meisten Programmiersprachen als [[Array]] von [[char]]s umgesetzt.
+
Eine '''Zeichenkette''', oder auch (''engl.'') '''String''', ist eine Folge von Zeichen und Symbolen. Als solche werden sie in den meisten Programmiersprachen als [[Array]] von [[char]]s umgesetzt.
  
In Java haben Strings jedoch eine eigene, von anderen Programmelementen abgehobene Syntax und Semantik. In Java sind Strings [[Objekt]]e. Jedoch besitzen sie die Eigenschaft, dass sie mit dem '''+''' Operator konkateniert (aneinandergehangen) werden können. Dabei wird jedoch der String nicht verändert, sondern ein neues Stringobjekt erstellt, welches die neue Zeichenkette repräsentiert. Die beiden anderen Stringobjekte bleiben erhalten.
+
=Strings in Java=
  
Gibt man in Java eine Zeichenkette direkt an, wie z.B. <code>"Hallo Welt"</code>, so wird beim Übersetzungsprozess ein Zeichenkettenobjekt in einer von der Standardbibliothek verwalteten Pool an konstant angegebenen Zeichenketten hinterlegt. Wird an anderer Stelle im Quellcode die Zeichenkette <code>"Hallo Welt"</code> erneut angegeben, so referenzieren beide Zeichenketten den selben String. Da die Stringklasse jedoch keine Methoden bereitstellt, um die intern verwaltete Zeichenkette zu manipulieren, ist dies mit keinen zu beachtenden Problemen verbunden, außer, dass man Strings besser mit der <code>.equals()</code> Methode meiteinander vergleichen soll, da die Referenzen, die mit '''==''' verglichen werden, nicht unbedingt die gleichen sein müssen.
+
In [[Java]] haben Strings jedoch eine eigene, von anderen Programmelementen abgehobene Syntax und Semantik.
 +
 
 +
Hier sind Strings keine [[Primitiver Datentyp|primitiven Datentypen]], sondern werden durch [[Objekt]]e abgebildet und sind dementsprechend '''konstant'''. Das heißt der Inhalt einer von einem '''Stringobjekt''' repräsentierten Zeichenkette kann ''nicht'' verändert werden.
 +
 
 +
Strings besitzen die Eigenschaft, dass sie mit dem '''+'''-[[Operator]] konkateniert (d. h. aneinandergehängt) werden können. Hierbei werden die an der Operation beteiligten Strings nicht verändert (konstant!). Stattdessen erstellt das Java-Programm neue Stringobjekte und eine Referenz auf diese wird durch den Term repräsentiert.
 +
 
 +
Im Quellcode kann zudem eine Zeichenkette zwischen Anführungszeichen (''' " ''') deklariert werden:
 +
 
 +
<source lang="java">
 +
String foo = "bar";
 +
</source>
 +
 
 +
Ein zwischen solchen Anführungszeichen angegebener Text ist ein Stringobjekt -- genauer: Eine Referenz auf einen String mit dem entsprechenden Inhalt in einem von der [[JVM]] verwalteten Pool an Zeichenketten. Dieser Pool wird während des Übersetzungsprozesses definiert. Kommt eine Zeichenkette, wie z.B. "Hallo Welt", mehrmals direkt im Quellcode vor, repräsentieren alle Vorkommen dieser Zeichenkette eine Referenz auf denselben String im konstanten Stringpool.
 +
 
 +
= Vergleiche =
 +
 
 +
Wenn Strings inhaltlich miteinander verglichen werden sollen, sollte der '''=='''-Operator vermieden werden. Da bei Strings Objekte vorliegen, werden mit dem '''=='''-Operator die '''Referenzen''' miteinander verglichen.
 +
 
 +
<source lang="java" title="Beispiel Hallo Welt">
 +
String s1 = "Hallo Welt";
 +
String s2 = "Hallo ";
 +
String s3 = "Welt";
 +
String s4 = s2 + s3;
 +
</source>
 +
 
 +
In diesem Beispiel läge nahe, dass s1 und s4 der gleiche String sind. Mit dem '''=='''-Operator würden diese Instanzen jedoch nicht die gleichen sein, da s1, s2 und s3 jeweils Referenzen auf den konstanten Stringpool sind, s4 jedoch ein String ist, der lokal im Quellcode erst aus den Fragmenten generiert wird. Der [[Compiler]] kann in dem Moment nicht wissen, dass s4 und s1 den gleichen String ergeben würden (er müsste die Operatoren beim Übersetzungsprozess zuerst auswerten, was meistens nicht gewünscht ist), weswegen er auch den daraus entstehenden String nicht aus dem konstanten Stringpool wählt. Die Referenzen der beiden Strings sind also unterschiedlich und <code>s1 == s4</code> wird zu '''false''' ausgewertet.
 +
 
 +
Stattdessen verwendet man <code>s1.equals(s4)</code>, da die '''equals'''-Methode von Strings die Strings ''inhaltlich'' miteinander vergleicht.

Aktuelle Version vom 8. November 2017, 14:22 Uhr

Eine Zeichenkette, oder auch (engl.) String, ist eine Folge von Zeichen und Symbolen. Als solche werden sie in den meisten Programmiersprachen als Array von chars umgesetzt.

Strings in Java

In Java haben Strings jedoch eine eigene, von anderen Programmelementen abgehobene Syntax und Semantik.

Hier sind Strings keine primitiven Datentypen, sondern werden durch Objekte abgebildet und sind dementsprechend konstant. Das heißt der Inhalt einer von einem Stringobjekt repräsentierten Zeichenkette kann nicht verändert werden.

Strings besitzen die Eigenschaft, dass sie mit dem +-Operator konkateniert (d. h. aneinandergehängt) werden können. Hierbei werden die an der Operation beteiligten Strings nicht verändert (konstant!). Stattdessen erstellt das Java-Programm neue Stringobjekte und eine Referenz auf diese wird durch den Term repräsentiert.

Im Quellcode kann zudem eine Zeichenkette zwischen Anführungszeichen ( " ) deklariert werden:

String foo = "bar";

Ein zwischen solchen Anführungszeichen angegebener Text ist ein Stringobjekt -- genauer: Eine Referenz auf einen String mit dem entsprechenden Inhalt in einem von der JVM verwalteten Pool an Zeichenketten. Dieser Pool wird während des Übersetzungsprozesses definiert. Kommt eine Zeichenkette, wie z.B. "Hallo Welt", mehrmals direkt im Quellcode vor, repräsentieren alle Vorkommen dieser Zeichenkette eine Referenz auf denselben String im konstanten Stringpool.

Vergleiche

Wenn Strings inhaltlich miteinander verglichen werden sollen, sollte der ==-Operator vermieden werden. Da bei Strings Objekte vorliegen, werden mit dem ==-Operator die Referenzen miteinander verglichen.

String s1 = "Hallo Welt";
String s2 = "Hallo ";
String s3 = "Welt";
String s4 = s2 + s3;

In diesem Beispiel läge nahe, dass s1 und s4 der gleiche String sind. Mit dem ==-Operator würden diese Instanzen jedoch nicht die gleichen sein, da s1, s2 und s3 jeweils Referenzen auf den konstanten Stringpool sind, s4 jedoch ein String ist, der lokal im Quellcode erst aus den Fragmenten generiert wird. Der Compiler kann in dem Moment nicht wissen, dass s4 und s1 den gleichen String ergeben würden (er müsste die Operatoren beim Übersetzungsprozess zuerst auswerten, was meistens nicht gewünscht ist), weswegen er auch den daraus entstehenden String nicht aus dem konstanten Stringpool wählt. Die Referenzen der beiden Strings sind also unterschiedlich und s1 == s4 wird zu false ausgewertet.

Stattdessen verwendet man s1.equals(s4), da die equals-Methode von Strings die Strings inhaltlich miteinander vergleicht.