1. StringTokenizer
klass
Och nu några fler vanliga scenarier som involverar arbete med strängar. Hur delar man upp en sträng i flera delar? Det finns flera sätt att göra detta.
split()
metod
Det första sättet att dela upp en sträng i flera delar är att använda split()
metoden. Ett reguljärt uttryck som definierar en speciell avgränsande sträng måste skickas som ett argument. Du kommer att lära dig vad ett reguljärt uttryck är i Java Multithreading- uppdraget.
Exempel:
Koda | Resultat |
---|---|
|
Resultatet blir en uppsättning av tre strängar:
|
Enkelt, men ibland är detta tillvägagångssätt överdrivet. Om det finns många avgränsare (till exempel mellanslag, nyradstecken, tabbar, punkter), måste du konstruera ett ganska komplext reguljärt uttryck. Den är svår att läsa och därför svår att modifiera.
StringTokenizer
klass
Java har en specialklass vars hela jobb är att dela upp en sträng i delsträngar.
Den här klassen använder inte reguljära uttryck: istället skickar du bara in en sträng som består av avgränsare. Fördelen med detta tillvägagångssätt är att det inte bryter hela strängen i bitar på en gång, utan istället flyttas från början till slut ett steg i taget.
Klassen har en konstruktor och två viktiga metoder. Vi skickar konstruktorn en sträng som vi delar upp i delar, och en sträng som består av en uppsättning avgränsande tecken.
Metoder | Beskrivning |
---|---|
|
Returnerar nästa delsträng |
|
Kontrollerar om det finns fler delsträngar. |
Den här klassen påminner på något sätt om klassen Scanner, som också har nextLine()
och hasNextLine()
metoder.
Du kan skapa ett StringTokenizer
objekt med detta kommando:
StringTokenizer name = new StringTokenizer(string, delimiters);
Var string
ska strängen delas upp i delar. Och delimiters
är en sträng, och varje tecken i den behandlas som en avgränsare. Exempel:
Koda | Konsolutgång |
---|---|
|
|
Observera att varje tecken i strängen som skickas som den andra strängen till konstruktorn StringTokenizer
anses vara en separator.
2. String.format()
metod och StringFormatter
klass
En annan intressant metod för String-klassen är format()
.
Låt oss säga att du har olika variabler som lagrar data. Hur visar du dem på skärmen på en rad? Till exempel har vi lite data (vänster kolumn) och önskad utdata (höger kolumn):
Koda | Konsolutgång |
---|---|
|
|
Din kod kommer förmodligen att se ut ungefär så här:
Programkod |
---|
|
Sådan kod är inte särskilt läsbar. Och om variabelnamnen var längre, skulle koden bli ännu svårare:
Programkod |
---|
|
Inte särskilt läsvärd, eller hur?
Men det här är en vanlig situation i verkliga program, så jag vill berätta om ett sätt att skriva den här koden enklare och mer koncist.
String.format
Klassen String har en statisk format()
metod: den låter dig specificera ett mönster för att sammanställa en sträng med data. Kommandots allmänna utseende är som följer:
String name = String.format(pattern, parameters);
Exempel:
Koda | Resultat |
---|---|
|
|
|
|
|
|
Metodens format()
första parameter är en formatsträng som innehåller all önskad text tillsammans med specialtecken som kallas formatspecificerare (som %d
och %s
) på de platser där du behöver infoga data.
Metoden format()
ersätter dessa %s
och %d
formatspecifikationer med parametrarna som följer formatsträngen i parameterlistan. Om vi vill infoga en sträng så skriver vi %s
. Om vi vill infoga ett tal är formatspecifikationen %d
. Exempel:
Koda | Resultat |
---|---|
|
s är lika med"a=1, b=4, c=3" |
Här är en kort lista över formatspecifikationer som kan användas i formatsträngen:
Specifierare | Menande |
---|---|
|
String |
|
interger: byte , short , int ,long |
|
verkligt tal: float ,double |
|
boolean |
|
char |
|
Date |
|
% karaktär |
Dessa specifikationer anger typen av data, men det finns också specifikationer som anger ordningen på data. För att få ett argument genom dess nummer (numreringen börjar från ett), måste du skriva " " istället för " ". Exempel:%1$d
%d
Koda | Resultat |
---|---|
|
s är lika med"a=13, b=12, c=11" |
%3$d
kommer att få det 3:e argumentet, %2$d
kommer att få det andra argumentet och %d
kommer att få det allra första argumentet. Formatspecifikationerna %s
och %d
hänvisar till argument oavsett specifikationer som %3$d
eller%2$s
3. String Pool
Varje sträng som anges i kod som en bokstavlig sträng lagras i ett minnesområde som kallas medan StringPool
programmet körs. StringPool
är en speciell array för att lagra strängar. Dess syfte är att optimera stränglagring:
Först måste strängarna som anges i koden lagras någonstans, eller hur? Koden består av kommandon, men data (särskilt stora strängar) måste lagras i minnet separat från koden. Endast referenser till strängobjekt visas i kod.
För det andra måste alla identiska strängliteraler endast lagras i minnet en gång. Och det är bara så det fungerar. När din klasskod laddas av Java-maskinen läggs alla strängliteraler till StringPool
om de inte redan finns där. Om de redan finns där använder vi helt enkelt en strängreferens från StringPool
.
Följaktligen, om du tilldelar samma literal till flera String
variabler i din kod, kommer dessa variabler att innehålla samma referens. En bokstavlig kommer att läggas till StringPool
endast en gång. I alla andra fall kommer koden att få en referens till strängen som redan är laddad i StringPool
.
Så här fungerar det ungefär:
Koda | Arbeta med StringPool |
---|---|
|
|
Det är därför variablerna a
och b
kommer att lagra samma referenser.
intern()
metod
Och det bästa är att du programmässigt kan lägga till vilken sträng som helst till StringPool
. För att göra detta behöver du bara anropa String
variabelns intern()
metod.
Metoden intern()
lägger till strängen till StringPool
om den inte redan finns där, och returnerar en referens till strängen i StringPool
.
Om två identiska strängar läggs till med StringPool
metoden intern()
returnerar metoden samma referens. Detta kan användas för att jämföra strängar genom referens. Exempel:
Koda | Notera |
---|---|
|
|
|
|
Det är osannolikt att du använder den här metoden ofta, men folk älskar att fråga om det i intervjuer . Så det är bättre att veta om det än att inte veta.
GO TO FULL VERSION