1. StringTokenizer
klasse
Og nå noen flere vanlige scenarier som involverer arbeid med strenger. Hvordan deler du en streng i flere deler? Det er flere måter å gjøre dette på.
split()
metode
Den første måten å dele en streng i flere deler er å bruke split()
metoden. Et regulært uttrykk som definerer en spesiell avgrensende streng må sendes som et argument. Du vil lære hva et regulært uttrykk er i Java Multithreading- oppdraget.
Eksempel:
Kode | Resultat |
---|---|
|
Resultatet vil være en rekke av tre strenger:
|
Enkelt, men noen ganger er denne tilnærmingen overdreven. Hvis det er mange skilletegn (for eksempel mellomrom, nylinjetegn, tabulatorer, punktum), må du konstruere et ganske komplekst regulært uttrykk. Det er vanskelig å lese og derfor vanskelig å endre.
StringTokenizer
klasse
Java har en spesialklasse hvis hele jobben er å dele en streng i understrenger.
Denne klassen bruker ikke regulære uttrykk: i stedet sender du bare inn en streng som består av skilletegn. Fordelen med denne tilnærmingen er at den ikke bryter hele strengen i stykker på en gang, men i stedet beveger seg fra begynnelse til slutt ett trinn om gangen.
Klassen har en konstruktør og to viktige metoder. Vi sender konstruktøren en streng som vi deler i deler, og en streng som består av et sett med avgrensende tegn.
Metoder | Beskrivelse |
---|---|
|
Returnerer neste delstreng |
|
Sjekker om det er flere understrenger. |
Denne klassen minner på en måte om Scanner-klassen, som også har nextLine()
og hasNextLine()
metoder.
Du kan lage et StringTokenizer
objekt med denne kommandoen:
StringTokenizer name = new StringTokenizer(string, delimiters);
Hvor string
skal strengen deles i deler. Og delimiters
er en streng, og hvert tegn i den behandles som et skilletegn. Eksempel:
Kode | Konsollutgang |
---|---|
|
|
Merk at hvert tegn i strengen som sendes som den andre strengen til konstruktøren StringTokenizer
regnes som en skilletegn.
2. String.format()
metode og StringFormatter
klasse
En annen interessant metode for String-klassen er format()
.
La oss si at du har forskjellige variabler som lagrer data. Hvordan viser du dem på skjermen på én linje? For eksempel har vi noen data (venstre kolonne) og ønsket utgang (høyre kolonne):
Kode | Konsollutgang |
---|---|
|
|
Koden din vil sannsynligvis se omtrent slik ut:
Programkode |
---|
|
Slik kode er lite lesbar. Og hvis variabelnavnene var lengre, ville koden blitt enda vanskeligere:
Programkode |
---|
|
Ikke veldig lesbart, er det?
Men dette er en vanlig situasjon i programmer i den virkelige verden, så jeg vil fortelle deg om en måte å skrive denne koden enklere og mer konsist på.
String.format
String-klassen har en statisk format()
metode: den lar deg spesifisere et mønster for å sette sammen en streng med data. Det generelle utseendet til kommandoen er som følger:
String name = String.format(pattern, parameters);
Eksempel:
Kode | Resultat |
---|---|
|
|
|
|
|
|
Metodens format()
første parameter er en formatstreng som inneholder all ønsket tekst sammen med spesialtegn som kalles formatspesifisatorer (som %d
og %s
) på de stedene du skal sette inn data.
Metoden format()
erstatter disse %s
og %d
formatspesifikasjonene med parameterne som følger formatstrengen i parameterlisten. Hvis vi vil sette inn en streng, så skriver vi %s
. Hvis vi vil sette inn et tall, er formatspesifikasjonen %d
. Eksempel:
Kode | Resultat |
---|---|
|
s er lik"a=1, b=4, c=3" |
Her er en kort liste over formatspesifikasjoner som kan brukes i formatstrengen:
Spesifiser | Betydning |
---|---|
|
String |
|
interger: byte , short , int ,long |
|
reelt tall: float ,double |
|
boolean |
|
char |
|
Date |
|
% karakter |
Disse spesifikasjonene angir typen data, men det finnes også spesifikasjoner som indikerer rekkefølgen på dataene. For å få et argument etter nummeret (nummereringen starter fra én), må du skrive " " i stedet for " ". Eksempel:%1$d
%d
Kode | Resultat |
---|---|
|
s er lik"a=13, b=12, c=11" |
%3$d
vil få det 3. argumentet, %2$d
vil få det andre argumentet, og %d
vil få det aller første argumentet. Formatspesifikasjonene %s
og %d
refererer til argumenter uavhengig av spesifikasjoner som %3$d
eller%2$s
3. Strengebasseng
Hver streng spesifisert i kode som en streng-literal er lagret i et minneområde som kalles mens StringPool
programmet kjører. StringPool
er en spesiell matrise for lagring av strenger. Formålet er å optimalisere strenglagring:
Først må strengene som er spesifisert i koden lagres et sted, ikke sant? Kode består av kommandoer, men data (spesielt store strenger) må lagres i minnet separat fra koden. Bare referanser til strengobjekter vises i kode.
For det andre må alle identiske strengliteraler bare lagres i minnet én gang. Og det er bare slik det fungerer. Når klassekoden din lastes inn av Java-maskinen, legges alle strenge bokstaver til StringPool
hvis de ikke allerede er der. Hvis de allerede er der, bruker vi ganske enkelt en strengreferanse fra StringPool
.
Følgelig, hvis du tilordner samme bokstavelige til flere String
variabler i koden din, vil disse variablene inneholde den samme referansen. En bokstavelig vil bli lagt til den StringPool
eneste ene. I alle andre tilfeller vil koden få en referanse til strengen som allerede er lastet inn i StringPool
.
Slik fungerer det omtrent:
Kode | Arbeide med StringPool |
---|---|
|
|
Det er derfor variablene a
og b
vil lagre de samme referansene.
intern()
metode
Og det beste er at du kan legge til en hvilken som helst streng i StringPool
. For å gjøre dette trenger du bare å kalle String
variabelens intern()
metode.
Metoden intern()
vil legge til strengen til StringPool
hvis den ikke allerede er der, og vil returnere en referanse til strengen i StringPool
.
Hvis to identiske strenger legges til ved å StringPool
bruke intern()
metoden, returnerer metoden den samme referansen. Dette kan brukes til å sammenligne strenger ved referanse. Eksempel:
Kode | Merk |
---|---|
|
|
|
|
Det er usannsynlig at du bruker denne metoden ofte, men folk elsker å spørre om det i intervjuer . Så det er bedre å vite om det enn å ikke vite.
GO TO FULL VERSION