4.3 Zeichenfolgen
Ein String ist eine Sammlung von Zeichen (Datentyp char), die die Laufzeitumgebung geordnet im Speicher ablegt. Die Zeichen sind einem Zeichensatz entnommen, der in Java dem 16-Bit-Unicode-Standard entspricht – mit einigen Umwegen ist auch Unicode 4 mit 32-Bit-Zeichen möglich.
Java sieht drei Klassen vor, die Zeichenfolgen verwalten. Sie unterscheiden sich in drei Punkten:
- Sind die Zeichenfolgen unveränderbar (immutable), können sie also später nicht mehr verändert werden?
- Sind die Zeichenfolgen später veränderbar (mutable)?
- Sind die Operationen auf den Zeichenketten gegen nebenläufige Zugriffe aus mehreren Threads abgesichert?
Verwaltet immutable Zeichenketten | Verwaltet mutable Zeichenketten | |
Threadsicher | String | StringBuffer |
Nicht threadsicher | - | StringBuilder |
Die Klasse String
Die Klasse String repräsentiert nicht änderbare Zeichenketten. (Allgemein heißen Objekte, deren Zustand sich nicht verändern lässt, immutable.) Daher ist ein String immer threadsicher, denn eine Synchronisation ist nur dann nötig, wenn es Änderungen geben kann. Mit Objekten vom Typ String lässt sich nach Zeichen oder Teilzeichenketten suchen, und ein String lässt sich mit einem anderen String vergleichen, aber Zeichen im String können nicht verändert werden. Es gibt einige Methoden, die scheinbar Veränderungen an Strings vornehmen, aber sie erzeugen in Wahrheit neue String-Objekte, die die veränderten Zeichenreihen repräsentieren. So entsteht beim Aneinanderhängen zweier String-Objekte als Ergebnis ein drittes String-Objekt für die zusammengefügte Zeichenreihe.
Die Klassen StringBuilder/StringBuffer
Die Klassen StringBuilder und StringBuffer repräsentieren im Gegensatz zu String dynamische, beliebig änderbare Zeichenreihen. Der Unterschied zwischen den API-gleichen Klassen ist lediglich, dass StringBuffer vor nebenläufigen Operationen geschützt ist, StringBuilder nicht. Die Unterscheidung ist bei Strings nicht nötig, denn wenn Objekte nachträglich nicht veränderbar sind, machen parallele Lesezugriffe keine Schwierigkeiten.
Beispiel |
String-Objekte selbst lassen sich nicht verändern, aber natürlich lässt sich eine Referenz auf ein anderes String-Objekt setzen: String s = "tutego"; |
Der Basistyp CharSequence für Zeichenketten
CharSequence ist die gemeinsame Schnittstelle von String, StringBuilder und StringBuffer und wird in der Bibliothk mehrfach verwendet. Nehmen wir ein Beispiel: Die Klasse String deklariert eine Methode contains(CharSequence s), die testet, ob der Teilstring s im String vorkommt. Von welchem Typ kann nun die Variable s sein? Wir können Exemplare etwa von String, StringBuilder oder StringBuffer übergeben, weil dies alles CharSequences sind. Wir steigen später noch etwas genauer in den Typ ein, an dieser Stelle reicht es zu wissen, dass wir uns überall, wo CharSequence steht, String, StringBuilder oder StringBuffer denken können.
Bestehen Strings aus char-Feldern?
Die drei Klassen String, StringBuilder, StringBuffer entsprechen der idealen Umsetzung der objektorientierten Idee (mit der wir uns in Kapitel 5, »Eigene Klassen schreiben«, intensiv auseinandersetzen): Wie genau die Zeichenfolgen gespeichert werden, dringt nicht nach außen. Zwar ist es so, dass die Zeichenfolgen intern als char-Arrays abgebildet werden, aber dieses Feld ist privat und somit sind keine Zugriffe von außen möglich. Selbst die Länge ist ein privates Attribut der Klassen, die nur über eine Methode zugänglich ist. Das Schöne ist also, dass die Klassen uns also die lästige Arbeit abnehmen, selbst Zeichenfolgen in Feldern verwalten zu müssen.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.