1. StringTokenizer
klasse
Og nu et par mere almindelige scenarier, der involverer arbejde med strenge. Hvordan deler man en streng op i flere dele? Der er flere måder at gøre dette på.
split()
metode
Den første måde at opdele en streng i flere dele er at bruge split()
metoden. Et regulært udtryk, der definerer en speciel afgrænsende streng, skal sendes som et argument. Du vil lære, hvad et regulært udtryk er i Java Multithreading- quest.
Eksempel:
Kode | Resultat |
---|---|
|
Resultatet vil være en række af tre strenge:
|
Simpelt, men nogle gange er denne tilgang overdreven. Hvis der er mange afgrænsningstegn (f.eks. mellemrum, linjeskifttegn, tabulatorer, punktum), så skal du konstruere et ret komplekst regulært udtryk. Den er svær at læse og derfor svær at ændre.
StringTokenizer
klasse
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 skilletegn. Fordelen ved denne fremgangsmåde er, at den ikke knækker hele strengen i stykker på én gang, men i stedet bevæger sig fra start til slut et trin ad gangen.
Klassen har en konstruktør og to vigtige 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 |
---|---|
|
Returnerer den næste understreng |
|
Tjekker om der er flere understrenge. |
Denne klasse minder på en eller anden måde om Scanner-klassen, som også har nextLine()
og hasNextLine()
metoder.
Du kan oprette et StringTokenizer
objekt med denne kommando:
StringTokenizer name = new StringTokenizer(string, delimiters);
Hvor string
skal strengen deles i dele. Og delimiters
er en streng, og hvert tegn i den behandles som en afgrænsning. Eksempel:
Kode | Konsoludgang |
---|---|
|
|
Bemærk, at hvert tegn i strengen, der sendes som den anden streng til StringTokenizer
konstruktøren, betragtes som en separator.
2. String.format()
metode og StringFormatter
klasse
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 |
---|---|
|
|
Din kode vil sandsynligvis se sådan her ud:
Program kode |
---|
|
En sådan kode er ikke særlig læsbar. Og hvis variabelnavnene var længere, ville koden blive endnu sværere:
Program kode |
---|
|
Ikke særlig læseværdig, vel?
Men 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
String-klassen har en statisk format()
metode: den lader dig angive et mønster til at samle en streng med data. Kommandoens generelle udseende er som følger:
String name = String.format(pattern, parameters);
Eksempel:
Kode | Resultat |
---|---|
|
|
|
|
|
|
Metodens format()
første parameter er en formatstreng, der indeholder al den ønskede tekst sammen med specialtegn kaldet formatspecificatorer (såsom %d
og %s
) på de steder, hvor du skal indsætte data.
Metoden format()
erstatter disse %s
og %d
formatspecifikationer med de parametre, der følger formatstrengen i parameterlisten. Hvis vi vil indsætte en streng, så skriver vi %s
. Hvis vi vil indsætte et tal, så er formatspecifikationen %d
. Eksempel:
Kode | Resultat |
---|---|
|
s er lig med"a=1, b=4, c=3" |
Her er en kort liste over formatspecifikationer, der kan bruges inde i formatstrengen:
Specifikator | Betyder |
---|---|
|
String |
|
interger: byte , short , int ,long |
|
reelle tal: float ,double |
|
boolean |
|
char |
|
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 " " i stedet for " ". Eksempel:%1$d
%d
Kode | Resultat |
---|---|
|
s er lig med"a=13, b=12, c=11" |
%3$d
får det 3. argument, %2$d
får det andet argument og %d
får det allerførste argument. Angivelserne %s
og %d
formatet refererer til argumenter uanset specifikationer som %3$d
eller%2$s
3. String Pool
Hver streng angivet i kode som en streng-literal er gemt i et hukommelsesområde kaldet StringPool
mens programmet kører. StringPool
er et specielt array til lagring af strenge. Dens formål er at optimere strenglagring:
For det første skal de strenge, der er angivet i koden, 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 sådan fungerer det bare. Når din klassekode indlæses af Java-maskinen, tilføjes alle strenge bogstaver til, StringPool
hvis de ikke allerede er der. Hvis de allerede er der, så bruger vi blot en strengreference fra StringPool
.
Derfor, hvis du tildeler den samme literal til flere String
variabler i din kode, vil disse variable indeholde den samme reference. En bogstavelig vil blive tilføjet til den StringPool
eneste ene. 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 | Arbejde med StringPool |
---|---|
|
|
Det er derfor, variablerne a
og b
vil gemme de samme referencer.
intern()
metode
Og det bedste er, at du programmæssigt kan tilføje enhver streng til StringPool
. For at gøre dette skal du blot kalde String
variablens intern()
metode.
Metoden intern()
tilføjer strengen til, StringPool
hvis den ikke allerede er der, og returnerer en reference til strengen i StringPool
.
Hvis to identiske strenge tilføjes til at StringPool
bruge intern()
metoden, returnerer metoden den samme reference. Dette kan bruges til at sammenligne strenge ved reference. Eksempel:
Kode | Bemærk |
---|---|
|
|
|
|
Det er usandsynligt, at du bruger denne metode ofte, men folk elsker at spørge om det i interviews . Så det er bedre at vide om det end ikke at vide.
GO TO FULL VERSION