Een fragment uit een lezing met een mentor als onderdeel van de Codegym University-cursus. Schrijf je in voor de volledige cursus.


"Hallo, Amigo! Vandaag gaan we een paar veelvoorkomende scenario's analyseren die te maken hebben met het werken met strings. Weet jij bijvoorbeeld hoe je een string in verschillende delen splitst?"

'Ik ga het je niet meteen vertellen, Ellie. Maar jij gaat het mij wel vertellen, toch?'

split()methode

"Er zijn verschillende manieren om dit te doen. De eerste manier om een ​​string in meerdere delen te splitsen is door de split()methode te gebruiken. Een reguliere expressie die een speciale begrenzende string definieert, moet als parameter worden doorgegeven. Je leert wat een reguliere expressie is in de Java Collections- zoektocht.

Voorbeeld:

Code Resultaat
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Het resultaat is een array van drie strings:
["Good ", "ws everyo", "!"]

Eenvoudig, maar soms is deze aanpak overdreven. Als er veel scheidingstekens zijn (bijvoorbeeld spaties, tekens voor nieuwe regels, tabs, punten), dan moet je een nogal complexe reguliere expressie maken."

"Nou, natuurlijk. En als het moeilijk te lezen is, dan is het moeilijk om veranderingen aan te brengen.

StringTokenizerklas

Een fragment uit een lezing met een mentor als onderdeel van de Codegym University-cursus. Schrijf je in voor de volledige cursus.


"Java heeft een speciale klasse wiens taak het is om een ​​string op te splitsen in substrings.

"Deze klasse gebruikt geen reguliere expressies: in plaats daarvan geef je gewoon een string door die bestaat uit scheidingstekens. Het voordeel van deze aanpak is dat de hele string niet in één keer in stukken wordt gebroken, maar in plaats daarvan van het begin naar het einde gaat. stap voor stap.

De klasse heeft een constructor en twee methoden. We geven de constructor een tekenreeks door die we in delen splitsen, en een tekenreeks die bestaat uit een reeks begrenzingstekens.

methoden Beschrijving
String nextToken()
Retourneert de volgende subtekenreeks
boolean hasMoreTokens()
Controleert of er meer subtekenreeksen zijn.

"Deze klasse doet me op de een of andere manier denken aan de klasse Scanner, die ook methoden nextLine()en heeft hashNextLine().

"Dat is een goede observatie die je hebt gemaakt. Je kunt een StringTokenizerobject maken met deze opdracht:

StringTokenizer name = new StringTokenizer(string, delimiters);

Waar string de string is die in delen moet worden verdeeld. En scheidingstekens is een tekenreeks en elk teken erin wordt behandeld als een scheidingsteken. Voorbeeld:

Code Console-uitvoer
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
!

"Merk op dat elk teken in de tekenreeks die in de tweede tekenreeks aan de StringTokenizerconstructor wordt doorgegeven, wordt beschouwd als een scheidingsteken.

String.format()methode en StringFormatterklasse

"Een andere interessante methode van de klasse String is format().

"Stel dat u verschillende variabelen hebt die gegevens opslaan. Hoe geeft u ze op één regel op het scherm weer? We hebben bijvoorbeeld enkele gegevens (linkerkolom) en gewenste uitvoer (rechterkolom):

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

De code voor zo'n programma ziet er ongeveer zo uit:

Programmacode
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.}");

"Je zult het met me eens zijn dat de code niet erg leesbaar is. En als de namen van variabelen langer waren, zou de code nog moeilijker worden:

Programmacode
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, het is moeilijk te lezen!"

"Maak je geen zorgen. Dit is een veel voorkomende situatie in real-world programma's, dus ik wil je vertellen over een manier om deze code eenvoudiger en beknopter te schrijven.

String.format

"De Stringklasse heeft een statische format()methode: hiermee kunt u een patroon specificeren voor het samenstellen van een string met gegevens. Het algemene uiterlijk van de opdracht is als volgt:

String name = String.format(pattern, parameters);

Voorbeeld:

Code Resultaat
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

"De format()eerste parameter van de methode is een formaatreeks die alle gewenste tekst bevat, samen met speciale tekens die formaatspecificaties worden genoemd (zoals %den %s) op de plaatsen waar u gegevens moet invoegen.

"De format()methode vervangt deze %sen %dopmaakspecificaties door de parameters die volgen op de opmaakstring in de parameterlijst. Als we een string willen invoegen, dan schrijven we . %sAls we een getal willen invoegen, dan is de opmaakspecificatie %d. Voorbeeld:

Code Resultaat
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sis gelijk aan"a=1, b=4, c=3"

"Hier is een korte lijst met indelingsspecificaties die kunnen worden gebruikt in de indelingsreeks:

Specificatie Betekenis
%s
String
%d
interger: byte, short, int,long
%f
echt nummer: float,double
%b
boolean
%c
char
%t
Date
%%
%karakter

"Deze specificaties geven het type gegevens aan, maar er zijn ook specificaties die de volgorde van de gegevens aangeven. Om een ​​argument op nummer te krijgen (de nummering begint bij één), moet u "% 1$ d" schrijven in plaats van " %d ". Voorbeeld:

Code Resultaat
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sis gelijk aan"a=13, b=12, c=11"

%3$dkrijgt het 3e argument, %2$dkrijgt het tweede argument en %dkrijgt het allereerste argument. De %sen %dformaatspecificaties verwijzen naar argumenten, ongeacht de specificatie zoals %3$dof%2$s

String zwembad

"Elke tekenreeks die in code is gespecificeerd als een letterlijke tekenreeks, wordt opgeslagen in een geheugengebied dat de wordt genoemd StringPoolterwijl het programma wordt uitgevoerd. StringPoolis een speciale array voor het opslaan van tekenreeksen. Het doel ervan is om de opslag van tekenreeksen te optimaliseren:

"Ten eerste moeten de in code gespecificeerde strings ergens worden opgeslagen, toch? Code bestaat uit commando's, maar gegevens (vooral grote strings) moeten afzonderlijk van de code in het geheugen worden opgeslagen. Alleen verwijzingen naar stringobjecten verschijnen in code.

"Ten tweede moeten alle identieke letterlijke tekenreeksen slechts één keer in het geheugen worden opgeslagen. En dat is precies hoe het werkt. Wanneer uw klassecode wordt geladen door de Java-machine, worden alle letterlijke tekenreeksen toegevoegd aan de als ze er nog niet zijn. Als ze dat wel StringPoolzijn al aanwezig is, gebruiken we gewoon een stringreferentie uit de StringPool.

Dienovereenkomstig, als u dezelfde letterlijke waarde toewijst aan verschillende String-variabelen in uw code, dan zullen deze variabelen dezelfde verwijzing bevatten. Er wordt een letterlijke waarde toegevoegd aan de StringPoolenige keer. In alle andere gevallen krijgt de code een verwijzing naar de string die al in het StringPool.

Hier is ongeveer hoe het werkt:

Code Werken met StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"Daarom slaan de variabelen aen bdezelfde referenties op."

"Ik hoop dat ik het allemaal goed begrepen heb.

intern()methode.

"En het beste is dat je elke string programmatisch kunt toevoegen aan de StringPool. Om dit te doen, hoef je alleen maar de methode Stringvan de variabele aan te roepen.intern()

"De intern()methode voegt de string toe aan de StringPoolals die er nog niet is, en geeft een verwijzing terug naar de string in de StringPool.

"En wat gebeurt er als twee identieke strings worden toegevoegd aan de met StringPoolbehulp van de intern()methode?"

"De methode retourneert dezelfde referenties. Dit kan worden gebruikt om strings te vergelijken op basis van referentie. Voorbeeld:

Code Opmerking
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

Het is onwaarschijnlijk dat u deze methode vaak zult gebruiken. Dat gezegd hebbende, mensen vragen er graag naar in sollicitatiegesprekken.

'Dus het is beter om er iets van te weten dan om het niet te weten. Bedankt, Ellie!'