Et foredragsuddrag med en mentor som en del af Codegym University-kurset. Tilmeld dig hele kurset.
"Hej, Amigo! I dag vil vi analysere et par mere almindelige scenarier, der involverer arbejde med strenge. Ved du for eksempel, hvordan man opdeler en streng i flere dele?"
"Jeg vil ikke fortælle dig det med det samme, Ellie. Men du vil fortælle mig det, vel?"
split()metode
"Der er flere måder at gøre dette på. Den første måde at opdele en streng i flere dele er at bruge metoden split(). Et regulært udtryk, der definerer en særlig afgrænsende streng, skal videregives som en parameter. Du vil lære, hvad et regulært udtryk er i Java Collections- opgaven.
Eksempel:
| Kode | Resultat |
|---|---|
|
Resultatet vil være en række af tre strenge:
|
Enkel, men nogle gange er denne tilgang overdreven. Hvis der er mange afgrænsningstegn (f.eks. mellemrum, nylinjetegn, tabulatorer, punktum), så skal du konstruere et ret komplekst regulært udtryk."
"Jamen, selvfølgelig. Og hvis det er svært at læse, så er det svært at lave ændringer.
StringTokenizerklasse
Et foredragsuddrag med en mentor som en del af Codegym University-kurset. Tilmeld dig hele kurset.
"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 afgrænsningstegn. Fordelen ved denne fremgangsmåde er, at den ikke brækker hele strengen i stykker på én gang, men i stedet flytter fra start til slut. skridt ad gangen.
Klassen har en konstruktør og to 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 mig på en eller anden måde om Scanner-klassen, som også har nextLine()og hashNextLine()metoder.
"Det er en god observation, du har lavet. Du kan oprette et StringTokenizerobjekt med denne kommando:
StringTokenizer name = new StringTokenizer(string, delimiters);
Hvor streng er strengen, der skal opdeles i dele. Og afgrænsningstegn er en streng, og hvert tegn i den behandles som et skilletegn. Eksempel:
| Kode | Konsoludgang |
|---|---|
|
|
"Bemærk, at hvert tegn i strengen, der sendes i den anden streng til StringTokenizerkonstruktøren, betragtes som en separator.
String.format()metode og StringFormatterklasse
"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 |
|---|---|
|
|
Koden til et sådant program vil se nogenlunde sådan ud:
| Program kode |
|---|
|
"Du er enig med mig i, at koden ikke er særlig læsbar. Og hvis variabelnavnene var længere, ville koden blive endnu sværere:
| Program kode |
|---|
|
"Ja, det er hård læsning!"
"Bare rolig. 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
" StringKlassen har en statisk format()metode: den lader dig specificere et mønster til at samle en streng med data. Det generelle udseende af kommandoen er som følger:
String name = String.format(pattern, parameters);
Eksempel:
| Kode | Resultat |
|---|---|
|
|
|
|
|
|
" format()Metodens første parameter er en formatstreng, der indeholder al den ønskede tekst sammen med specialtegn kaldet formatspecificatorer (såsom %dog %s) på de steder, hvor du skal indsætte data.
" format()Metoden erstatter disse %sog %dformatspecifikationer med de parametre, der følger efter formatstrengen i parameterlisten. Hvis vi vil indsætte en streng, så skriver vi . %sHvis vi vil indsætte et tal, så er formatspecifikationen %d. Eksempel:
| Kode | Resultat |
|---|---|
|
ser 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 " % 1$ d " i stedet for " %d ". Eksempel:
| Kode | Resultat |
|---|---|
|
ser lig med"a=13, b=12, c=11" |
%3$dfår det 3. argument, %2$dfår det andet argument og %dfår det allerførste argument. Angivelserne %sog %dformatet refererer til argumenter uanset specifikationer som %3$deller%2$s
String Pool
"Hver streng angivet i kode som en streng-literal er gemt i et hukommelsesområde kaldet mens StringPoolprogrammet kører. StringPooler en speciel matrix til lagring af strenge. Dens formål er at optimere strenglagring:
"For det første skal de strenge, der er angivet i kode, 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 det er bare sådan, det virker. Når din klassekode indlæses af Java-maskinen, føjes alle strengliteraler til, hvis de ikke allerede er der. Hvis de StringPooler allerede der, så bruger vi blot en strengreference fra StringPool.
Derfor, hvis du tildeler den samme literal til flere strengvariabler i din kode, vil disse variable indeholde den samme reference. En bogstavelig vil blive tilføjet til den StringPoolkun én gang. 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 | Arbejder med StringPoll |
|---|---|
|
|
"Det er derfor, variablerne aog bvil gemme de samme referencer."
"Jeg håber, jeg har forstået det hele rigtigt.
intern()metode.
"Og det bedste er, at du programmæssigt kan tilføje en hvilken som helst streng til StringPool. For at gøre dette skal du blot kalde variablens Stringmetode intern().
" intern()Metoden tilføjer strengen til, StringPoolhvis den ikke allerede er der, og returnerer en reference til strengen i StringPool.
"Og hvad vil der ske, hvis to identiske strenge tilføjes til at StringPoolbruge intern()metoden?"
"Metoden returnerer de samme referencer. Dette kan bruges til at sammenligne strenge ved reference. Eksempel:
| Kode | Bemærk |
|---|---|
|
|
|
|
Det er usandsynligt, at du bruger denne metode ofte. Når det er sagt, kan folk godt lide at spørge om det i jobsamtaler.
"Så, det er bedre at vide om det end ikke at vide det. Tak, Ellie!"
GO TO FULL VERSION