1. StringTokenizerosztály

És most néhány gyakoribb forgatókönyv a karakterláncokkal való munka során. Hogyan lehet egy karakterláncot több részre osztani? Ennek többféle módja van.

split()módszer

A karakterlánc több részre való felosztásának első módja a módszer használata split(). Egy speciális határoló karakterláncot definiáló reguláris kifejezést argumentumként kell átadni. A Java Multithreading küldetésben megtudhatja, mi az a reguláris kifejezé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 összeállítani. Nehezen olvasható, ezért nehéz módosítani.

StringTokenizerosztály

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 adnia egy elválasztó karakterláncot. Ennek a megközelítésnek az az előnye, hogy nem töri egyszerre darabokra a teljes húrt, hanem lépésenként halad elejétől a végéig.

Az osztálynak van egy konstruktora és két fontos 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, aminek szintén nextLine()és hasNextLine()metódusai vannak.

StringTokenizerEzzel a paranccsal hozhat létre objektumot:

StringTokenizer name = new StringTokenizer(string, delimiters);

Hol stringvan a részekre osztandó karakterlánc. Az And delimitersegy 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
!

Vegye figyelembe, hogy a karakterlánc minden egyes karaktere, amelyet második karakterláncként ad át a konstruktornak, StringTokenizerelválasztónak számít.



2. 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 lehet őket egy sorban megjeleníteni a képernyőn? Például van néhány adatunk (bal oldali 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.}

A kódja valószínűleg így fog kinézni:

Program kó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.}");

Az ilyen kód nem nagyon olvasható. És ha a változónevek hosszabbak lennének, akkor a kód még nehezebbé válik:

Program kód

class User {
    ......
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getFriends() {
        return friends;
    }

    public ExtraInformation getExtraInformation() {
        return extraInformation;
    }
}

User user = new User();

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

Nem túl olvasható, igaz?

De ez gyakori helyzet a valós programokban, ezért szeretnék elmondani egy módot, amellyel egyszerűbben és tömörebben írhatjuk ezt a kódot.

String.format

A String osztá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, valamint a formátum-specifikátoroknak nevezett speciális karaktereket (például %dés %s) azokon a helyeken, ahol adatokat kell beszúrni.

A format()metódus ezeket %sés %da formátumspecifikációkat lecseréli azokra a paraméterekre, amelyek a paraméterlistában szereplő formátum karakterláncot követik. Ha egy karakterláncot akarunk beszúrni, akkor azt írjuk %s. Ha számot szeretnénk beszúrni, akkor a formátummeghatározó a %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ációk is, amelyek az adatok sorrendjét jelzik. Ha a szám alapján szeretne argumentumot kapni (a számozás 1-től kezdődik), a " " helyett a " " karaktert kell írnia . Példa:%1$d%d

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



3. String Pool

StringPoolA program futása közben a kódban karakterlánc-literálként megadott összes karakterlánc a memória egy területén van tárolva . StringPoolegy speciális tömb 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 el kell tárolni valahol, nem? A kód parancsokból áll, de az adatokat (különösen a nagy karakterláncokat) a kódtól elkülönítve kell a memóriában tárolni. Csak a karakterlánc objektumokra való hivatkozások jelennek meg a kódban.

Másodszor, minden azonos karakterlánc-literált csak egyszer kell a memóriában tárolni. És ez csak így működik. Amikor az osztálykódot betölti a Java gép, az összes karakterlánc-literál hozzáadódik a kódhoz, StringPoolha még nincs ott. Ha már ott vannak, akkor egyszerűen használjunk egy karakterlánc hivatkozást a StringPool.

Ennek megfelelően, ha ugyanazt a literált rendeli hozzá több Stringvá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 A StringPool 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 bváltozók ugyanazokat a hivatkozásokat tárolják.

intern()módszer

És a legjobb az egészben az, hogy bármilyen karakterláncot programozottan hozzáadhat a StringPool. Ehhez csak meg kell hívni 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.

Ha két azonos karakterláncot adunk a metódushoz StringPool, intern()akkor a metódus ugyanazt a hivatkozást adja vissza. Ez felhasználható a karakterláncok hivatkozással történő összehasonlítására. 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, de az emberek szívesen kérdeznek róla az interjúk során . Tehát jobb tudni róla, mint nem tudni.