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
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Resultatet blir en uppsättning av tre strängar:
["Good ", "ws everyo", "!"]

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.

StringTokenizerklass

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
String nextToken()
Returnerar nästa delsträng
boolean hasMoreTokens()
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 StringTokenizerobjekt 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
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
!

"Observera att varje tecken i strängen som skickas i den andra strängen till StringTokenizerkonstruktorn anses vara en separator.

String.format()metod och StringFormatterklass

"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
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Koden för ett sådant program kommer att se ut ungefär så här:

Programkod
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 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
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 ä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

" StringKlassen 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
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örsta parameter är en formatsträng som innehåller all önskad text tillsammans med specialtecken som kallas formatspecificerare (som %doch %s) på de platser där du behöver infoga data.

"Metoden format()ersätter dessa %soch %dformatspecifikationerna med parametrarna som följer formatsträngen i parameterlistan. Om vi ​​vill infoga en sträng så skriver vi . Om %svi ​​vill infoga ett tal så är formatspecifikationen . %dExempel:

Koda Resultat
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
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
%s
String
%d
interger: byte, short, int,long
%f
verkligt tal: float,double
%b
boolean
%c
char
%t
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
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sär lika med"a=13, b=12, c=11"

%3$dkommer att få det 3:e argumentet, %2$dkommer att få det andra argumentet och %dkommer att få det allra första argumentet. Formatspecifikationerna %soch %dhänvisar till argument oavsett specifikationer som %3$deller%2$s

String Pool

"Varje sträng som anges i kod som en strängliteral lagras i ett minnesområde som kallas medan StringPoolprogrammet 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 StringPoolendast 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
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"Det är därför aoch bvariablerna 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 . StringPoolFör att göra detta behöver du bara anropa Stringvariabelns intern()metod.

"Metoden intern()lägger till strängen till StringPoolom 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 StringPoolmetoden? intern()"

"Metoden returnerar samma referenser. Detta kan användas för att jämföra strängar genom referens. Exempel:

Koda Notera
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 ä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!"