Looking for java Keywords? Try Ask4Keywords

Java LanguageZeichenketten


Einführung

Zeichenfolgen ( java.lang.String ) sind Textstücke, die in Ihrem Programm gespeichert sind. Strings sind in Java kein primitiver Datentyp , in Java-Programmen jedoch sehr häufig.

In Java sind Strings unveränderlich, was bedeutet, dass sie nicht geändert werden können. (Klicken Sie hier, um eine genauere Erklärung der Unveränderlichkeit zu erhalten.)

Bemerkungen

Da Java-Zeichenfolgen unveränderlich sind , geben alle Methoden, die einen String bearbeiten , ein neues String Objekt zurück . Sie ändern den ursprünglichen String . Dazu gehören untergeordnete Zeichenfolgen und Ersetzungsmethoden, von denen C- und C ++ - Programmierer erwarten würden, dass sie das Ziel- String Objekt mutieren.


Verwenden Sie einen StringBuilder anstelle von String wenn Sie mehr als zwei String Objekte verketten möchten, deren Werte nicht zur Kompilierzeit bestimmt werden können. Diese Technik ist performanter als das Erstellen neuer String Objekte und deren Verkettung, da StringBuilder veränderbar ist.

StringBuffer kann auch verwendet werden, um String Objekte zu verketten. Diese Klasse ist jedoch weniger leistungsfähig, da sie Thread-sicher ist und vor jeder Operation einen Mutex erhält. Da Sie bei der Verkettung von Strings fast nie Thread-Sicherheit benötigen, sollten Sie am besten StringBuilder .

Wenn Sie eine Zeichenfolgenverkettung als einen einzelnen Ausdruck ausdrücken können, ist es besser, den Operator + zu verwenden. Der Java-Compiler konvertiert einen Ausdruck, der + Verkettungen enthält, in eine effiziente Folge von Vorgängen, wobei entweder String.concat(...) oder StringBuilder . Der Hinweis zur Verwendung von StringBuilder explizit nur, wenn die Verkettung mehrere Ausdrücke enthält.


Speichern Sie vertrauliche Informationen nicht in Zeichenfolgen. Wenn jemand in der Lage ist, einen Speicherauszug Ihrer laufenden Anwendung abzurufen, kann er alle vorhandenen String Objekte finden und deren Inhalt lesen. Dies umfasst String Objekte, die nicht erreichbar sind und auf die Garbage Collection warten. Wenn dies ein Problem ist, müssen Sie die sensiblen String-Daten löschen, sobald Sie damit fertig sind. Mit String Objekten ist dies nicht möglich, da sie nicht veränderbar sind. Daher ist es ratsam, char[] -Objekte zum Speichern sensibler Zeichendaten zu verwenden und sie zu löschen (z. B. mit '\000' Zeichen überschreiben), wenn Sie fertig sind.


Alle String Instanzen werden auf dem Heap erstellt, sogar Instanzen, die String-Literalen entsprechen. Das Besondere an String-Literalen ist, dass die JVM dafür sorgt, dass alle Literale, die gleich sind (dh aus den gleichen Zeichen bestehen), durch ein einzelnes String Objekt dargestellt werden (dieses Verhalten wird in JLS angegeben). Dies wird von JVM-Klassenladern implementiert. Wenn ein Klassenladeprogramm eine Klasse lädt, sucht es nach String-Literalen, die in der Klassendefinition verwendet werden, und prüft jedes Mal, wenn es einen Eintrag im String-Pool für dieses Literal gibt (das Literal als Schlüssel). . Wenn bereits ein Eintrag für das Literal vorhanden ist, wird der Verweis auf eine String Instanz verwendet, die als Paar für dieses Literal gespeichert ist. Andernfalls wird eine neue String Instanz erstellt und ein Verweis auf die Instanz für das Literal (als Schlüssel verwendet) im String-Pool gespeichert. (Siehe auch String Interning ).

Der String-Pool wird im Java-Heap gehalten und unterliegt der normalen Speicherbereinigung.

Java SE 7

In Java-Versionen vor Java 7 wurde der String-Pool in einem speziellen Teil des Heap-Speichers gehalten, der als "PermGen" bezeichnet wird. Dieser Teil wurde nur gelegentlich gesammelt.

Java SE 7

In Java 7 wurde der String-Pool von "PermGen" verschoben.

Beachten Sie, dass String-Literale implizit von jeder Methode, die sie verwendet, erreichbar sind. Dies bedeutet, dass die entsprechenden String Objekte nur dann gesammelt werden können, wenn der Code selbst gesammelt wird.


Bis Java 8 werden String Objekte als ein UTF-16-Char-Array implementiert (2 Byte pro Char). In Java 9 gibt es einen Vorschlag, String als ein Byte-Array mit einem Codierungsflag-Feld zu implementieren, um zu beachten, ob die Zeichenfolge als Byte (LATIN-1) oder Zeichen (UTF-16) codiert ist.

Zeichenketten Verwandte Beispiele