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 |
|---|---|
|
Az eredmény egy három karakterláncból álló tömb lesz:
|
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 |
|---|---|
|
A következő részkarakterláncot adja vissza |
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
A kódja valószínűleg így fog kinézni:
| Program kód |
|---|
|
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 |
|---|
|
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 |
|---|---|
|
|
|
|
|
|
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 |
|---|---|
|
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 |
|---|---|
|
String |
|
interger: byte, short, int,long |
|
valós szám: float,double |
|
boolean |
|
char |
|
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 |
|---|---|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
|
|
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.
GO TO FULL VERSION