Előadásrészlet egy mentorral a Codegym University tanfolyam részeként. Jelentkezzen a teljes tanfolyamra.


"Szia, Amigo! Ma néhány gyakoribb forgatókönyvet fogunk elemezni a húrokkal való munkavégzéssel kapcsolatban. Tudod például, hogyan lehet egy karakterláncot több részre osztani?"

– Nem mondom el azonnal, Ellie. De te elmondod, igaz?

split()módszer

"Ennek többféle módja van. A karakterlánc több részre bontásának első módja a split()metódus használata. Egy speciális elválasztó karakterláncot definiáló reguláris kifejezést paraméterként kell átadni. Megtanulja, hogy mi a reguláris kifejezés a a Java Collections küldetés.

Példa:

Kód Eredmény
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Az eredmény egy három karakterláncból álló tömb lesz:
["Good ", "ws everyo", "!"]

Egyszerű, de néha túlzó ez a megközelítés. Ha sok határoló van (például szóközök, újsor karakterek, tabulátorok, pontok), akkor egy meglehetősen összetett reguláris kifejezést kell alkotnia."

"Nos, persze. És ha nehéz olvasni, akkor nehéz változtatni.

StringTokenizerosztály

Előadásrészlet egy mentorral a Codegym University tanfolyam részeként. Jelentkezzen a teljes tanfolyamra.


"A Java-nak van egy speciális osztálya, amelynek teljes feladata egy karakterlánc részkarakterláncokra osztása.

"Ez az osztály nem használ reguláris kifejezéseket: ehelyett egyszerűen át kell adni egy határoló karakterláncot. Ennek a megközelítésnek az az előnye, hogy nem bontja fel egyszerre a teljes karakterláncot, hanem az elejétől a végéig halad lépésenként.

Az osztálynak van egy konstruktora és két metódusa. Átadunk a konstruktornak egy karakterláncot, amelyet részekre bontunk, és egy karakterláncot, amely határoló karakterekből áll.

Mód Leírás
String nextToken()
A következő részkarakterláncot adja vissza
boolean hasMoreTokens()
Ellenőrzi, hogy van-e több részkarakterlánc.

"Ez az osztály valahogy a Scanner osztályra emlékeztet, amelynek szintén vannak nextLine()metódusai hashNextLine().

"Jó észrevételt tett. StringTokenizerEzzel a paranccsal hozhat létre objektumot:

StringTokenizer name = new StringTokenizer(string, delimiters);

Ahol a string a részekre osztandó karakterlánc. A határolók pedig egy karakterlánc, és minden benne lévő karaktert határolóként kezelünk. Példa:

Kód Konzol kimenet
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
!

"Ne feledje, hogy a második karakterláncban a StringTokenizerkonstruktornak átadott karakterlánc minden karaktere elválasztónak számít.

String.format()módszer és StringFormatterosztály

"A String osztály másik érdekes módszere a format().

"Tegyük fel, hogy különféle változók tárolják az adatokat. Hogyan jelenítheti meg őket egy sorban a képernyőn? Például van néhány adatunk (bal oszlop) és a kívánt kimenet (jobb oszlop):

Kód Konzol kimenet
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Egy ilyen program kódja így fog kinézni:

Programkód
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.}");

"Egyetértesz velem abban, hogy a kód nem nagyon olvasható. És ha a változónevek hosszabbak lennének, akkor a kód még nehezebbé válna:

Programkód
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.}");

– Igen, nehéz olvasmány!

"Ne aggódjon. Ez gyakori helyzet a valós programokban, ezért szeretném elmondani, hogyan írhatja meg ezt a kódot egyszerűbben és tömörebben.

String.format

"Az Stringosztálynak van egy statikus format()metódusa: lehetővé teszi egy minta megadását egy karakterlánc adatokkal való összeállításához. A parancs általános megjelenése a következő:

String name = String.format(pattern, parameters);

Példa:

Kód Eredmény
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

"A format()metódus első paramétere egy formátumkarakterlánc, amely tartalmazza az összes kívánt szöveget a speciális karakterekkel, úgynevezett formátum-specifikátorokkal (például %dés %s) azokon a helyeken, ahol adatokat kell beszúrni.

"A format()metódus ezeket %sés %da formátummeghatározókat azokra a paraméterekre cseréli, amelyek a paraméterlistában a formátum karakterláncot követik. Ha karakterláncot akarunk beszúrni, akkor azt írjuk, hogy . %sHa számot akarunk beszúrni, akkor a formátummeghatározó: %d. Példa:

Kód Eredmény
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
segyenlő"a=1, b=4, c=3"

"Íme a formátum-karakterláncon belül használható formátumspecifikátorok rövid listája:

Meghatározó Jelentése
%s
String
%d
interger: byte, short, int,long
%f
valós szám: float,double
%b
boolean
%c
char
%t
Date
%%
%karakter

"Ezek a specifikációk jelzik az adatok típusát, de vannak olyan specifikátorok is, amelyek az adatok sorrendjét jelzik. Ahhoz, hogy a szám alapján argumentumot kapjunk (a számozás egytől kezdődik), a " % 1$ d " karakterláncot kell beírni a " %d ". Példa:

Kód Eredmény
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
segyenlő"a=13, b=12, c=11"

%3$dmegkapja a 3. argumentumot, %2$dmegkapja a második argumentumot, és %dmegkapja a legelső argumentumot. A %sés %dformátumspecifikátorok argumentumokra hivatkoznak, függetlenül az olyan specifikációktól, mint %3$da vagy%2$s

String Pool

StringPool"Minden, a kódban karakterlánc-literálként megadott karakterlánc a program futása közben egy memóriaterületen tárolódik . StringPoolEz egy speciális tömb a karakterláncok tárolására. Célja a karakterláncok tárolásának optimalizálása:

"Először is a kódban megadott karakterláncokat kell tárolni valahol, ugye? A kód parancsokból áll, de az adatokat (főleg a nagy karakterláncokat) a kódtól elkülönítve kell tárolni a memóriában. A kódban csak a string objektumokra való hivatkozások jelennek meg.

"Másodszor, minden azonos karakterlánc-literált csak egyszer kell eltárolni a memóriában. És ez pontosan így működik. Amikor a Java gép betölti az osztálykódot, az összes karakterlánc-literált hozzáadja a szöveghez, ha még nincs ott. Ha StringPoolvannak már ott van, akkor egyszerűen használunk egy karakterlánc hivatkozást a StringPool.

Ennek megfelelően, ha ugyanazt a literált rendeli hozzá több karakterlánc-változóhoz a kódban, akkor ezek a változók ugyanazt a hivatkozást fogják tartalmazni. A literál csak egyszer lesz hozzáadva StringPool. Minden más esetben a kód hivatkozást kap a már betöltött karakterláncra StringPool.

Nagyjából a következőképpen működik:

Kód StringPoll használata
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"Ezért a aés ba változók ugyanazokat a hivatkozásokat tárolják."

„Remélem, mindent jól értettem.

intern()módszer.

"És a legjobb az egészben az, hogy programozottan bármilyen karakterláncot hozzáadhat a StringPool. Ehhez csak meg kell hívnia a Stringváltozó intern()metódusát.

"A intern()metódus hozzáadja a karakterláncot a karakterlánchoz StringPool, ha még nincs ott, és visszaadja a hivatkozást a karakterláncra a StringPool.

"És mi történik, ha két azonos karakterláncot adunk a StringPoolmetódushoz intern()?"

"A metódus ugyanazokat a hivatkozásokat adja vissza. Ezzel a karakterláncokat referencia alapján lehet összehasonlítani. Példa:

Kód jegyzet
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

Nem valószínű, hogy gyakran használja ezt a módszert. Ennek ellenére az emberek szeretnek erről kérdezni az állásinterjúkon.

– Szóval, jobb tudni róla, mint nem tudni. Köszönöm, Ellie!