1. StringTokenizer
клас
А сега още няколко общи сценария, включващи работа с низове. Как се разделя низ на няколко части? Има няколко начина да направите това.
split()
метод
Първият начин за разделяне на низ на множество части е използването на split()
метода. Регулярен израз, който дефинира специален разделящ низ, трябва да бъде подаден като аргумент. Ще научите Howво е регулярен израз в мисията Java Multithreading .
Пример:
Код | Резултат |
---|---|
|
Резултатът ще бъде масив от три низа:
|
Просто, но понякога този подход е прекален. Ако има много разделители (например интервали, знаци за нов ред, раздели, точки), тогава трябва да конструирате доста сложен регулярен израз. Трудно се чете и следователно трудно се променя.
StringTokenizer
клас
Java има специален клас, чиято работа е да раздели низ на поднизове.
Този клас не използва регулярни изрази: instead of това просто предавате низ, състоящ се от разделители. Предимството на този подход е, че той не разбива целия низ на части наведнъж, а instead of това се движи от началото до края стъпка по стъпка.
Класът има конструктор и два важни метода. Предаваме на конструктора низ, който разделяме на части, и низ, съставен от набор от разделителни знаци.
Методи | Описание |
---|---|
|
Връща следващия подниз |
|
Проверява дали има още поднизове. |
Този клас по няHowъв начин напомня на класа Scanner, който също има nextLine()
и hashNextLine()
методи.
Можете да създадете StringTokenizer
обект с тази команда:
StringTokenizer name = new StringTokenizer(string, delimiters);
Къде string
е низът, който трябва да се раздели на части. И delimiters
е низ и всеки знак в него се третира като разделител. Пример:
Код | Конзолен изход |
---|---|
|
|
Имайте предвид, че всеки знак в низа, предаден като втори низ към StringTokenizer
конструктора, се счита за разделител.
2. String.format()
метод и StringFormatter
клас
Друг интересен метод на класа String е format()
.
Да приемем, че имате различни променливи, съхраняващи данни. Как ги показвате на екрана в един ред? Например, имаме някои данни (лява колона) и желания резултат (дясна колона):
Код | Конзолен изход |
---|---|
|
|
Вашият code вероятно ще изглежда така:
Програмен code |
---|
|
Такъв code не е много четим. И ако имената на променливите бяха по-дълги, тогава codeът щеше да стане още по-труден:
Програмен code |
---|
|
Не е много четиво, нали?
Но това е често срещана ситуация в програмите от реалния свят, така че искам да ви разкажа за начин да напишете този code по-просто и по-сбито.
String.format
Класът String има статичен format()
метод: той ви позволява да посочите модел за сглобяване на низ с данни. Общият вид на командата е следният:
String name = String.format(pattern, parameters);
Пример:
Код | Резултат |
---|---|
|
|
|
|
|
|
Първият format()
параметър на метода е форматиращ низ, който съдържа целия желан текст заедно със специални знаци, наречени спецификатори на формат (като %d
и %s
) на местата, където трябва да вмъкнете данни.
Методът format()
замества тези %s
и %d
спецификаторите на формат с параметрите, които следват форматния низ в списъка с параметри. Ако искаме да вмъкнем низ, тогава пишем %s
. Ако искаме да вмъкнем число, тогава спецификаторът на формата е %d
. Пример:
Код | Резултат |
---|---|
|
s е равно на"a=1, b=4, c=3" |
Ето кратък списък със спецификатори на формат, които могат да се използват във форматния низ:
Спецификатор | Значение |
---|---|
|
String |
|
число: byte , short , int ,long |
|
реално число: float ,double |
|
boolean |
|
char |
|
Date |
|
% характер |
Тези спецификатори указват типа на данните, но има и спецификатори, които указват реда на данните. За да получите аргумент по неговия номер (номерацията започва от единица), трябва да напишете " " instead of " ". Пример:%1$d
%d
Код | Резултат |
---|---|
|
s е равно на"a=13, b=12, c=11" |
%3$d
ще получи третия аргумент, %2$d
ще получи втория аргумент и %d
ще получи първия аргумент. Спецификаторите %s
и %d
формат се отнасят до аргументи, независимо от спецификаторите като %3$d
or%2$s
3. Пул от низове
Всеки низ, указан в codeа като низов литерал, се съхранява в област от паметта, наречена докато StringPool
програмата работи. StringPool
е специален масив за съхранение на низове. Целта му е да оптимизира съхранението на низове:
Първо, низовете, посочени в codeа, трябва да се съхраняват някъде, нали? Кодът се състои от команди, но данните (особено големите низове) трябва да се съхраняват в паметта отделно от codeа. В codeа се появяват само препратки към низови обекти.
Второ, всички идентични низови литерали трябва да се съхраняват в паметта само веднъж. И това е просто How работи. Когато codeът на вашия клас се зарежда от Java машината, всички низови литерали се добавят към, StringPool
ако вече не са там. Ако те вече са там, тогава просто използваме препратка към низ от StringPool
.
Съответно, ако присвоите един и същ литерал на няколко String
променливи във вашия code, тогава тези променливи ще съдържат една и съща препратка. Към единствения веднъж ще бъде добавен литерал StringPool
. Във всички останали случаи codeът ще получи препратка към низа, който вече е зареден в StringPool
.
Ето How работи приблизително:
Код | Работа с StringPool |
---|---|
|
|
Ето защо променливите a
и b
ще съхраняват едни и същи препратки.
intern()
метод
И най-добрата част е, че можете програмно да добавите всеки низ към StringPool
. За да направите това, просто трябва да извикате метода String
на променливата intern()
.
Методът intern()
ще добави низа към, StringPool
ако вече не е там, и ще върне препратка към низа в StringPool
.
StringPool
Ако към метода се добавят два еднакви низа intern()
, методът връща същата препратка. Това може да се използва за сравняване на низове чрез препратка. Пример:
Код | Забележка |
---|---|
|
|
|
|
Малко вероятно е да използвате този метод често, но хората обичат да питат за него в интервюта . Така че е по-добре да знаете за това, отколкото да не знаете.