Ein Vorlesungsausschnitt mit einem Mentor im Rahmen des Codegym University-Kurses. Melden Sie sich für den gesamten Kurs an.


„Hallo, Amigo! Heute analysieren wir ein paar häufigere Szenarien, in denen es um die Arbeit mit Saiten geht. Wissen Sie zum Beispiel, wie man eine Saite in mehrere Teile aufteilt?“

„Ich werde es dir nicht sofort sagen, Ellie. Aber du wirst es mir sagen, oder?“

split()Methode

„Es gibt mehrere Möglichkeiten, dies zu tun. Die erste Möglichkeit, eine Zeichenfolge in mehrere Teile aufzuteilen, besteht darin, die split()Methode zu verwenden. Als Parameter muss ein regulärer Ausdruck übergeben werden, der eine spezielle begrenzende Zeichenfolge definiert. Sie erfahren, was ein regulärer Ausdruck ist die Java Collections- Quest.

Beispiel:

Code Ergebnis
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Das Ergebnis ist ein Array aus drei Zeichenfolgen:
["Good ", "ws everyo", "!"]

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.

„Na klar. Und wenn es schwer zu lesen ist, ist es auch schwer, Änderungen vorzunehmen.“

StringTokenizerKlasse

Ein Vorlesungsausschnitt mit einem Mentor im Rahmen des Codegym University-Kurses. Melden Sie sich für den gesamten Kurs an.


„Java hat eine spezielle Klasse, deren ganze Aufgabe darin besteht, einen String in Teilstrings aufzuteilen.

„Diese Klasse verwendet keine regulären Ausdrücke: Stattdessen übergeben Sie einfach einen String, der aus Trennzeichen besteht. Der Vorteil dieses Ansatzes besteht darin, dass er nicht den gesamten String auf einmal in Stücke zerlegt, sondern stattdessen vom Anfang zum Ende geht Schritt für Schritt.

Die Klasse verfügt über einen Konstruktor und zwei Methoden. Wir übergeben dem Konstruktor eine Zeichenfolge, die wir in Teile aufteilen, und eine Zeichenfolge, die aus einer Reihe von Trennzeichen besteht.

Methoden Beschreibung
String nextToken()
Gibt den nächsten Teilstring zurück
boolean hasMoreTokens()
Überprüft, ob weitere Teilzeichenfolgen vorhanden sind.

„Diese Klasse erinnert mich irgendwie an die Scanner-Klasse, die auch über nextLine()und hashNextLine()-Methoden verfügt.

„Das ist eine gute Beobachtung, die Sie gemacht haben. StringTokenizerMit diesem Befehl können Sie ein Objekt erstellen:

StringTokenizer name = new StringTokenizer(string, delimiters);

Wobei string die Zeichenfolge ist, die in Teile geteilt werden soll. Und Trennzeichen sind eine Zeichenfolge, und jedes Zeichen darin wird als Trennzeichen behandelt. Beispiel:

Code Konsolenausgabe
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

„Beachten Sie, dass jedes Zeichen in der Zeichenfolge, die in der zweiten Zeichenfolge an den StringTokenizerKonstruktor übergeben wird, als Trennzeichen betrachtet wird.

String.format()Methode und StringFormatterKlasse

„Eine weitere interessante Methode der String-Klasse ist format().

„Nehmen wir an, Sie haben verschiedene Variablen, in denen Daten gespeichert sind. Wie zeigen Sie diese in einer Zeile auf dem Bildschirm an? Beispielsweise haben wir einige Daten (linke Spalte) und die gewünschte Ausgabe (rechte Spalte):

Code Konsolenausgabe
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Der Code für ein solches Programm sieht etwa so aus:

Programmcode
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

„Sie werden mir zustimmen, dass der Code nicht sehr gut lesbar ist. Und wenn die Variablennamen länger wären, würde der Code noch schwieriger werden:

Programmcode
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

„Ja, es ist schwer zu lesen!“

„Keine Sorge. Dies kommt in realen Programmen häufig vor, daher möchte ich Ihnen eine Möglichkeit vorstellen, diesen Code einfacher und prägnanter zu schreiben.

String.format

„Die StringKlasse 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
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

„Der format()erste Parameter der Methode ist eine Formatzeichenfolge, die den gesamten gewünschten Text sowie Sonderzeichen, sogenannte Formatbezeichner (z. B. %dund %s), an den Stellen enthält, an denen Sie Daten einfügen müssen.

„Die format()Methode ersetzt diese %sund %dFormatbezeichner durch die Parameter, die der Formatzeichenfolge in der Parameterliste folgen. Wenn wir eine Zeichenfolge einfügen möchten, dann schreiben wir. %sWenn wir eine Zahl einfügen möchten, lautet der Formatbezeichner %d. Beispiel:

Code Ergebnis
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sist gleich"a=1, b=4, c=3"

„Hier ist eine kurze Liste von Formatspezifizierern, die innerhalb der Formatzeichenfolge verwendet werden können:

Spezifizierer Bedeutung
%s
String
%d
ganze Zahl: byte, short, int,long
%f
reelle Zahl: float,double
%b
boolean
%c
char
%t
Date
%%
%Charakter

„Diese Spezifizierer geben den Datentyp an, aber es gibt auch Spezifizierer, die die Reihenfolge der Daten angeben. Um ein Argument anhand seiner Nummer zu erhalten (die Nummerierung beginnt bei eins), müssen Sie „ % 1$ d „ anstelle von schreiben . %d ". Beispiel:

Code Ergebnis
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sist gleich"a=13, b=12, c=11"

%3$derhält das dritte Argument, %2$derhält das zweite Argument und %derhält das allererste Argument. Die Formatspezifizierer %sund beziehen sich auf Argumente, unabhängig von Spezifizierern wie oder%d%3$d%2$s

String-Pool

„Jede Zeichenfolge, die im Code als Zeichenfolgenliteral angegeben wird, wird StringPoolwährend der Ausführung des Programms in einem Speicherbereich namens gespeichert. StringPoolist ein spezielles Array zum Speichern von Zeichenfolgen. Sein Zweck besteht darin, die Zeichenfolgenspeicherung zu optimieren:

„Zuerst müssen die im Code angegebenen Zeichenfolgen irgendwo gespeichert werden, oder? Code besteht aus Befehlen, aber Daten (insbesondere große Zeichenfolgen) müssen getrennt vom Code im Speicher gespeichert werden. Im Code erscheinen nur Verweise auf Zeichenfolgenobjekte.

„Zweitens müssen alle identischen String-Literale nur einmal im Speicher gespeichert werden. Und genau so funktioniert es. Wenn Ihr Klassencode von der Java-Maschine geladen wird, werden alle String-Literale zum hinzugefügt, sofern sie noch nicht vorhanden sind. Wenn sie vorhanden StringPoolsind schon da, dann verwenden wir einfach eine String-Referenz aus der StringPool.

Wenn Sie dementsprechend in Ihrem Code mehreren String-Variablen dasselbe Literal zuweisen, enthalten diese Variablen dieselbe Referenz. Dem wird StringPoolnur 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 StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

„Deshalb speichern die Variablen aund dieselben Referenzen.“b

„Ich hoffe, ich habe alles richtig verstanden.

intern()Methode.

„Und das Beste daran ist, dass Sie dem programmgesteuert eine beliebige Zeichenfolge hinzufügen können StringPool. Dazu müssen Sie nur die Methode Stringder Variablen aufrufen.intern()

„Die intern()Methode fügt die Zeichenfolge hinzu, StringPoolsofern sie noch nicht vorhanden ist, und gibt einen Verweis auf die Zeichenfolge in zurück StringPool.

„Und was passiert, wenn mit der StringPoolMethode zwei identische Zeichenfolgen hinzugefügt werden intern()?“

„Die Methode gibt dieselben Referenzen zurück. Dies kann zum Vergleichen von Zeichenfolgen anhand von Referenzen verwendet werden. Beispiel:

Code Notiz
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Es ist unwahrscheinlich, dass Sie diese Methode oft verwenden. Allerdings wird in Vorstellungsgesprächen gerne danach gefragt.

„Also ist es besser, davon zu wissen, als es nicht zu wissen. Danke, Ellie!“