1. StringTokenizer
Klasse
Und nun noch ein paar weitere häufige Szenarien, bei denen es um die Arbeit mit Strings geht. Wie zerlegt man eine Saite in mehrere Teile? Dafür gibt es mehrere Möglichkeiten.
split()
Methode
Die erste Möglichkeit, eine Zeichenfolge in mehrere Teile aufzuteilen, ist die Verwendung der split()
Methode. Als Argument muss ein regulärer Ausdruck übergeben werden, der eine spezielle Trennzeichenfolge definiert. Was ein regulärer Ausdruck ist, erfahren Sie in der Java-Multithreading- Quest.
Beispiel:
Code | Ergebnis |
---|---|
|
Das Ergebnis ist ein Array aus drei Zeichenfolgen:
|
Einfach, aber manchmal ist dieser Ansatz übertrieben. Wenn viele Trennzeichen vorhanden sind (z. B. Leerzeichen, Zeilenumbrüche, Tabulatoren, Punkte), müssen Sie einen recht komplexen regulären Ausdruck erstellen. Es ist schwer zu lesen und daher schwer zu ändern.
StringTokenizer
Klasse
Java verfügt über eine spezielle Klasse, deren gesamte Aufgabe darin besteht, einen String in Teilstrings aufzuteilen.
Diese Klasse verwendet keine regulären Ausdrücke: Stattdessen übergeben Sie einfach eine Zeichenfolge bestehend aus Trennzeichen. Der Vorteil dieses Ansatzes besteht darin, dass nicht die gesamte Saite auf einmal in Stücke zerlegt wird, sondern Schritt für Schritt von Anfang bis Ende vorgegangen wird.
Die Klasse verfügt über einen Konstruktor und zwei wichtige Methoden. Wir übergeben dem Konstruktor eine Zeichenfolge, die wir in Teile aufteilen, und eine Zeichenfolge, die aus einer Reihe von Trennzeichen besteht.
Methoden | Beschreibung |
---|---|
|
Gibt den nächsten Teilstring zurück |
|
Überprüft, ob weitere Teilzeichenfolgen vorhanden sind. |
Diese Klasse erinnert irgendwie an die Scanner-Klasse, die ebenfalls über nextLine()
und- hasNextLine()
Methoden verfügt.
Mit diesem Befehl können Sie ein StringTokenizer
Objekt erstellen:
StringTokenizer name = new StringTokenizer(string, delimiters);
Wo string
ist die Zeichenfolge, die in Teile geteilt werden soll? Und delimiters
ist eine Zeichenfolge, und jedes Zeichen darin wird als Trennzeichen behandelt. Beispiel:
Code | Konsolenausgabe |
---|---|
|
|
Beachten Sie, dass jedes Zeichen in der Zeichenfolge, die als zweite Zeichenfolge an den StringTokenizer
Konstruktor übergeben wird, als Trennzeichen betrachtet wird.
2. String.format()
Methode und StringFormatter
Klasse
Eine weitere interessante Methode der String-Klasse ist format()
.
Nehmen wir an, Sie haben verschiedene Variablen, in denen Daten gespeichert sind. Wie stellt man sie in einer Zeile auf dem Bildschirm dar? Wir haben zum Beispiel einige Daten (linke Spalte) und die gewünschte Ausgabe (rechte Spalte):
Code | Konsolenausgabe |
---|---|
|
|
Ihr Code wird wahrscheinlich etwa so aussehen:
Programmcode |
---|
|
Ein solcher Code ist nicht sehr gut lesbar. Und wenn die Variablennamen länger wären, würde der Code noch schwieriger werden:
Programmcode |
---|
|
Nicht sehr gut lesbar, oder?
Da dies jedoch in realen Programmen häufig vorkommt, möchte ich Ihnen eine Möglichkeit vorstellen, diesen Code einfacher und prägnanter zu schreiben.
String.format
Die String-Klasse verfügt über eine statische format()
Methode: Sie ermöglicht die Angabe eines Musters zum Zusammenstellen einer Zeichenfolge mit Daten. Das allgemeine Erscheinungsbild des Befehls ist wie folgt:
String name = String.format(pattern, parameters);
Beispiel:
Code | Ergebnis |
---|---|
|
|
|
|
|
|
Der format()
erste Parameter der Methode ist eine Formatzeichenfolge, die den gesamten gewünschten Text sowie Sonderzeichen, sogenannte Formatbezeichner (z. B. %d
und %s
), an den Stellen enthält, an denen Sie Daten einfügen müssen.
Die format()
Methode ersetzt diese %s
und %d
Formatspezifizierer durch die Parameter, die der Formatzeichenfolge in der Parameterliste folgen. Wenn wir einen String einfügen wollen, dann schreiben wir %s
. Wenn wir eine Zahl einfügen möchten, lautet der Formatbezeichner %d
. Beispiel:
Code | Ergebnis |
---|---|
|
s ist gleich"a=1, b=4, c=3" |
Hier ist eine kurze Liste von Formatspezifizierern, die innerhalb der Formatzeichenfolge verwendet werden können:
Spezifizierer | Bedeutung |
---|---|
|
String |
|
ganze Zahl: byte , short , int ,long |
|
reelle Zahl: float ,double |
|
boolean |
|
char |
|
Date |
|
% Charakter |
Diese Spezifizierer geben den Datentyp an, es gibt aber auch Spezifizierer, die die Reihenfolge der Daten angeben. Um ein Argument anhand seiner Nummer zu erhalten (die Nummerierung beginnt bei eins), müssen Sie „ “ anstelle von „ “ schreiben . Beispiel:%1$d
%d
Code | Ergebnis |
---|---|
|
s ist gleich"a=13, b=12, c=11" |
%3$d
erhält das dritte Argument, %2$d
erhält das zweite Argument und %d
erhält das allererste Argument. Die Formatspezifizierer %s
und beziehen sich auf Argumente, unabhängig von Spezifizierern wie oder%d
%3$d
%2$s
3. String-Pool
StringPool
Jede im Code als String-Literal angegebene Zeichenfolge wird während der Ausführung des Programms in einem Speicherbereich namens gespeichert . StringPool
ist ein spezielles Array zum Speichern von Strings. Sein Zweck besteht darin, die String-Speicherung zu optimieren:
Erstens müssen die im Code angegebenen Zeichenfolgen irgendwo gespeichert werden, oder? Code besteht aus Befehlen, Daten (insbesondere große Zeichenfolgen) müssen jedoch getrennt vom Code im Speicher gespeichert werden. Im Code erscheinen nur Verweise auf Zeichenfolgenobjekte.
Zweitens müssen alle identischen Zeichenfolgenliterale nur einmal im Speicher gespeichert werden. Und genau so funktioniert es. Wenn Ihr Klassencode von der Java-Maschine geladen wird, werden alle Zeichenfolgenliterale hinzugefügt, sofern StringPool
sie noch nicht vorhanden sind. Wenn sie bereits vorhanden sind, verwenden wir einfach eine String-Referenz aus der StringPool
.
Wenn Sie also mehreren String
Variablen in Ihrem Code dasselbe Literal zuweisen, enthalten diese Variablen dieselbe Referenz. Dem wird StringPool
nur einmal ein Literal hinzugefügt. In allen anderen Fällen erhält der Code einen Verweis auf die bereits in die Datei geladene Zeichenfolge StringPool
.
So funktioniert es ungefähr:
Code | Arbeiten mit dem StringPool |
---|---|
|
|
Aus diesem Grund speichern die Variablen a
und dieselben Referenzen.b
intern()
Methode
Und das Beste daran ist, dass Sie dem programmgesteuert jede beliebige Zeichenfolge hinzufügen können StringPool
. Dazu müssen Sie lediglich die Methode String
der Variablen aufrufen intern()
.
Die intern()
Methode fügt die Zeichenfolge hinzu, StringPool
sofern sie noch nicht vorhanden ist, und gibt einen Verweis auf die Zeichenfolge in zurück StringPool
.
StringPool
Wenn mit der Methode zwei identische Zeichenfolgen hinzugefügt werden intern()
, gibt die Methode dieselbe Referenz zurück. Dies kann zum Vergleichen von Zeichenfolgen anhand von Referenzen verwendet werden. Beispiel:
Code | Notiz |
---|---|
|
|
|
|
Es ist unwahrscheinlich, dass Sie diese Methode oft anwenden, aber in Vorstellungsgesprächen wird gerne danach gefragt . Es ist also besser, davon zu wissen, als es nicht zu wissen.