Ett föreläsningsutdrag med en mentor som en del av Codegym University-kursen. Anmäl dig till hela kursen.
"Hej, Amigo! Idag ska vi analysera några fler vanliga scenarier som involverar arbete med strängar. Vet du till exempel hur man delar upp en sträng i flera delar?"
"Jag tänker inte berätta det direkt, Ellie. Men du ska berätta för mig, eller hur?"
split()
metod
"Det finns flera sätt att göra detta. Det första sättet att dela upp en sträng i flera delar är att använda metoden. split()
Ett reguljärt uttryck som definierar en speciell avgränsande sträng måste skickas som en parameter. Du kommer att lära dig vad ett reguljärt uttryck är i Java Collections- 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."
"Ja, visst. Och om det är svårt att läsa, då är det svårt att göra ändringar.
StringTokenizer
klass
Ett föreläsningsutdrag med en mentor som en del av Codegym University-kursen. Anmäl dig till hela kursen.
"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 den inte bryter hela strängen i bitar på en gång, utan flyttar från början till slut en steg i taget.
Klassen har en konstruktor och två 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 mig på något sätt om Scanner-klassen, som också har nextLine()
och hashNextLine()
metoder.
"Det är en bra observation du har gjort. Du kan skapa ett StringTokenizer
objekt med det här kommandot:
StringTokenizer name = new StringTokenizer(string, delimiters);
Där sträng är strängen som ska delas upp i delar. Och avgränsare ä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 i den andra strängen till StringTokenizer
konstruktorn anses vara en separator.
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 |
---|---|
|
|
Koden för ett sådant program kommer att se ut ungefär så här:
Programkod |
---|
|
"Du håller med mig om att koden inte är särskilt läsbar. Och om variabelnamnen var längre skulle koden bli ännu svårare:
Programkod |
---|
|
"Ja, det är svårt att läsa!"
"Oroa dig inte. 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
" String
Klassen har en statisk format()
metod: den låter dig specificera ett mönster för sammansättning av en sträng med data. Kommandots allmänna utseende är som följer:
String name = String.format(pattern, parameters);
Exempel:
Koda | Resultat |
---|---|
|
|
|
|
|
|
" format()
Metodens 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
formatspecifikationerna med parametrarna som följer formatsträngen i parameterlistan. Om vi vill infoga en sträng så skriver vi . Om %s
vi vill infoga ett tal så ä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å datan. För att få ett argument genom dess nummer (numreringen börjar från ett), måste du skriva " % 1$ d " istället för " %d ". Exempel:
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
String Pool
"Varje sträng som anges i kod som en strängliteral 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ör det första måste strängarna som anges i kod 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 koden.
"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 i om de inte redan finns där. Om de StringPool
är redan där, då använder vi helt enkelt en strängreferens från StringPool
.
Följaktligen, om du tilldelar samma literal till flera strängvariabler i din kod, kommer dessa variabler att innehålla samma referens. En bokstav 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 StringPoll |
---|---|
|
|
"Det är därför a
och b
variablerna kommer att lagra samma referenser."
"Jag hoppas att jag förstod det hela rätt.
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
.
"Och vad händer om två identiska strängar läggs till med StringPool
metoden? intern()
"
"Metoden returnerar samma referenser. 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. Som sagt, folk gillar att fråga om det på anställningsintervjuer.
"Så, det är bättre att veta om det än att inte veta. Tack, Ellie!"
GO TO FULL VERSION