Et foredragsuddrag med en mentor som en del af Codegym University-kurset. Tilmeld dig hele kurset.


"Hej, Amigo! I dag vil vi analysere et par mere almindelige scenarier, der involverer arbejde med strenge. Ved du for eksempel, hvordan man opdeler en streng i flere dele?"

"Jeg vil ikke fortælle dig det med det samme, Ellie. Men du vil fortælle mig det, vel?"

split()metode

"Der er flere måder at gøre dette på. Den første måde at opdele en streng i flere dele er at bruge metoden split(). Et regulært udtryk, der definerer en særlig afgrænsende streng, skal videregives som en parameter. Du vil lære, hvad et regulært udtryk er i Java Collections- opgaven.

Eksempel:

Kode Resultat
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Resultatet vil være en række af tre strenge:
["Good ", "ws everyo", "!"]

Enkel, men nogle gange er denne tilgang overdreven. Hvis der er mange afgrænsningstegn (f.eks. mellemrum, nylinjetegn, tabulatorer, punktum), så skal du konstruere et ret komplekst regulært udtryk."

"Jamen, selvfølgelig. Og hvis det er svært at læse, så er det svært at lave ændringer.

StringTokenizerklasse

Et foredragsuddrag med en mentor som en del af Codegym University-kurset. Tilmeld dig hele kurset.


"Java har en speciel klasse, hvis hele opgave er at opdele en streng i understrenge.

"Denne klasse bruger ikke regulære udtryk: I stedet sender du blot en streng, der består af afgrænsningstegn. Fordelen ved denne fremgangsmåde er, at den ikke brækker hele strengen i stykker på én gang, men i stedet flytter fra start til slut. skridt ad gangen.

Klassen har en konstruktør og to metoder. Vi sender konstruktøren en streng, som vi opdeler i dele, og en streng bestående af et sæt afgrænsende tegn.

Metoder Beskrivelse
String nextToken()
Returnerer den næste understreng
boolean hasMoreTokens()
Tjekker om der er flere understrenge.

"Denne klasse minder mig på en eller anden måde om Scanner-klassen, som også har nextLine()og hashNextLine()metoder.

"Det er en god observation, du har lavet. Du kan oprette et StringTokenizerobjekt med denne kommando:

StringTokenizer name = new StringTokenizer(string, delimiters);

Hvor streng er strengen, der skal opdeles i dele. Og afgrænsningstegn er en streng, og hvert tegn i den behandles som et skilletegn. Eksempel:

Kode Konsoludgang
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
!

"Bemærk, at hvert tegn i strengen, der sendes i den anden streng til StringTokenizerkonstruktøren, betragtes som en separator.

String.format()metode og StringFormatterklasse

"En anden interessant metode i String-klassen er format().

"Lad os sige, at du har forskellige variabler, der lagrer data. Hvordan viser du dem på skærmen på én linje? For eksempel har vi nogle data (venstre kolonne) og ønsket output (højre kolonne):

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

Koden til et sådant program vil se nogenlunde sådan ud:

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

"Du er enig med mig i, at koden ikke er særlig læsbar. Og hvis variabelnavnene var længere, ville koden blive endnu sværere:

Program kode
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, det er hård læsning!"

"Bare rolig. Dette er en almindelig situation i programmer i den virkelige verden, så jeg vil gerne fortælle dig om en måde at skrive denne kode mere enkelt og mere kortfattet på.

String.format

" StringKlassen har en statisk format()metode: den lader dig specificere et mønster til at samle en streng med data. Det generelle udseende af kommandoen er som følger:

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

Eksempel:

Kode Resultat
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

" format()Metodens første parameter er en formatstreng, der indeholder al den ønskede tekst sammen med specialtegn kaldet formatspecificatorer (såsom %dog %s) på de steder, hvor du skal indsætte data.

" format()Metoden erstatter disse %sog %dformatspecifikationer med de parametre, der følger efter formatstrengen i parameterlisten. Hvis vi vil indsætte en streng, så skriver vi . %sHvis vi vil indsætte et tal, så er formatspecifikationen %d. Eksempel:

Kode Resultat
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
ser lig med"a=1, b=4, c=3"

"Her er en kort liste over formatspecifikationer, der kan bruges inde i formatstrengen:

Specifikator Betyder
%s
String
%d
interger: byte, short, int,long
%f
reelle tal: float,double
%b
boolean
%c
char
%t
Date
%%
%Karakter

"Disse specifikationer angiver typen af ​​data, men der er også specifikationer, der angiver rækkefølgen af ​​dataene. For at få et argument ved dets nummer (nummereringen starter fra et), skal du skrive " % 1$ d " i stedet for " %d ". Eksempel:

Kode Resultat
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
ser lig med"a=13, b=12, c=11"

%3$dfår det 3. argument, %2$dfår det andet argument og %dfår det allerførste argument. Angivelserne %sog %dformatet refererer til argumenter uanset specifikationer som %3$deller%2$s

String Pool

"Hver streng angivet i kode som en streng-literal er gemt i et hukommelsesområde kaldet mens StringPoolprogrammet kører. StringPooler en speciel matrix til lagring af strenge. Dens formål er at optimere strenglagring:

"For det første skal de strenge, der er angivet i kode, gemmes et sted, ikke? Kode består af kommandoer, men data (især store strenge) skal lagres i hukommelsen adskilt fra koden. Kun referencer til strengobjekter vises i kode.

"For det andet skal alle identiske strengliteraler kun gemmes i hukommelsen én gang. Og det er bare sådan, det virker. Når din klassekode indlæses af Java-maskinen, føjes alle strengliteraler til, hvis de ikke allerede er der. Hvis de StringPooler allerede der, så bruger vi blot en strengreference fra StringPool.

Derfor, hvis du tildeler den samme literal til flere strengvariabler i din kode, vil disse variable indeholde den samme reference. En bogstavelig vil blive tilføjet til den StringPoolkun én gang. I alle andre tilfælde vil koden få en reference til den streng, der allerede er indlæst i StringPool.

Sådan fungerer det nogenlunde:

Kode Arbejder med StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"Det er derfor, variablerne aog bvil gemme de samme referencer."

"Jeg håber, jeg har forstået det hele rigtigt.

intern()metode.

"Og det bedste er, at du programmæssigt kan tilføje en hvilken som helst streng til StringPool. For at gøre dette skal du blot kalde variablens Stringmetode intern().

" intern()Metoden tilføjer strengen til, StringPoolhvis den ikke allerede er der, og returnerer en reference til strengen i StringPool.

"Og hvad vil der ske, hvis to identiske strenge tilføjes til at StringPoolbruge intern()metoden?"

"Metoden returnerer de samme referencer. Dette kan bruges til at sammenligne strenge ved reference. Eksempel:

Kode Bemærk
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

Det er usandsynligt, at du bruger denne metode ofte. Når det er sagt, kan folk godt lide at spørge om det i jobsamtaler.

"Så, det er bedre at vide om det end ikke at vide det. Tak, Ellie!"