Для работы со строками в Java существует класс
String. И для
объявления новой строки можно использовать один из способов:
String str1 = "Java";
String str2 = new String(); // пустая строка
String str3 = new String(new char[] {'h', 'e', 'l', 'l', 'o'});
String str4 = new String(new char[]{'w', 'e', 'l', 'c', 'o', 'm', 'e'}, 3, 4);
В последнем варианте 3 – это начальный
индекс (индексы считаются с нуля), а 4 – это кол-во символов. То есть, строка str4 содержит
строку «come».
Важной особенностью строк в Java является их неизменяемость.
Это значит, что в строке нельзя попросту изменить какой-либо символ и получить
другую строку. Все строки создаются и существуют в неизменном виде, пока не
будут уничтожены (как правило, автоматически сборщиком мусора). А переменные str1, str2, str3 и str4 следует
воспринимать лишь как ссылки на эти строки. То есть, в любой момент в программе
можно записать такую конструкцию:
что означает изменение ссылки str1 на строку «hello», на которую
указывает ссылка str3. Соответственно, если на первую строку «Java» не будет
указывать никакая ссылка, то она автоматически уничтожается.
У класса String есть несколько
полезных методов:
Название
метода класса String
|
Описание
|
length()
|
возвращает
число символов в строке (длину строки)
|
toCharArray()
|
возвращает
строку в виде массива символов char[]
|
isEmpty()
|
определяет
является ли строка пустой
|
concat()
|
объединяет
строки
|
valueOf()
|
преобразует
объект в строковый вид
|
join()
|
объединяет
строки
|
сompare()
|
сравнивает
две строки
|
charAt()
|
возвращает
символ строки по индексу
|
getChars()
|
возвращает
группу символов
|
equals()
|
сравнивает
строки с учетом регистра
|
equalsIgnoreCase()
|
сравнивает
строки без учета регистра
|
regionMatches()
|
сравнивает
подстроки в строках
|
indexOf()
|
находит
индекс первого вхождения подстроки в строку
|
lastIndexOf()
|
находит
индекс последнего вхождения подстроки в строку
|
startsWith()
|
определяет,
начинается ли строка с подстроки
|
endsWith()
|
определяет,
заканчивается ли строка на определенную подстроку
|
replace()
|
заменяет
в строке одну подстроку на другую
|
trim()
|
удаляет
начальные и конечные пробелы
|
substring()
|
возвращает
подстроку, начиная с определенного индекса до конца или до определенного
индекса
|
toLowerCase()
|
переводит
все символы строки в нижний регистр
|
toUpperCase()
|
переводит
все символы строки в верхний регистр
|
Разберем работу часто используемых
методов класса String. Первый метод, как написано, возвращает
длину строки. Например, если нам дана вот такая строка
то метод length() вернет значение 4
System.out.println(str1.length()); // 4
Далее, если к строке str2
применить метод toCharArray():
char[] helloArray = str1.toCharArray();
то получим массив символов с содержимым
этой строки. Следующий пример. У нас есть пустая строка
тогда мы можем определить это, например,
так:
if(s.length() == 0) System.out.println("String is empty");
или так:
if(s isEmpty()) System.out.println("String is empty");
Но, если строка задана вот так:
то это означает, что ссылка s не указывает ни
на какой класс String и, соответственно, мы не можем вызывать
методы этого класса. В этом случае проверку следует делать так:
if(s != null && s.length() == 0) System.out.println("String is empty");
мы здесь сначала проверяем: указывает ли
ссылка s на объект
класса и если это так, то только потом будет идти обращение к методу length().
Объединение строк
Для соединения строк можно использовать
операцию сложения ("+"):
При этом если в операции сложения строк
используется не строковый объект, например, число, то этот объект преобразуется
к строке:
Еще один метод объединения - метод join() позволяет
объединить строки с учетом разделителя. Например, две строки
будут сливаться в одно слово "HelloJava", если их
объединить с помощью оператора +:
но если мы хотим, чтобы две подстроки при
соединении были разделены пробелом, то можно воспользоваться методом join() следующим
образом:
В общем случае вместо пробела здесь
можно ставить любой разделитель в виде строки.
Обратите внимание, что каждый раз при
объединении строк мы получали новую строку как результат объединения.
Извлечение символов и подстрок
Для извлечения
символов по индексу в классе String определен метод
char charAt(int
index)
Он принимает
индекс, по которому надо получить символов, и возвращает извлеченный символ:
String str = "Java";
char c = str.charAt(2);
System.out.println(c); // v
(здесь как и в
массивах первый индекс равен 0).
Если надо
извлечь сразу группу символов или подстроку, то можно использовать метод
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Он принимает
следующие параметры:
-
srcBegin:
индекс строки, с которого начинается извлечение символов;
-
srcEnd:
индекс строки, до которого идет извлечение символов;
-
dst:
массив символов, в который будут извлекаться символы;
-
dstBegin:
индекс массива dst, с которого надо добавлять извлеченные из строки символы.
String str = "Hello world!";
int start = 6;
int end = 11;
char[] dst=new char[end - start];
str.getChars(start, end, dst, 0);
System.out.println(dst); // world
Сравнение строк
Для простого сравнения
строк используются методы equals() (с учетом регистра) и equalsIgnoreCase()
(без учета регистра). Оба метода в качестве параметра принимают строку, с
которой сравниваются:
String str1 = "Hello";
String str2 = "hello";
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
Обратите
внимание, что в отличие сравнения числовых и других данных примитивных типов
для сравнения строк не рекомендуется использовать оператор ==. То есть,
записывать вот такое сравнение лучше не использовать:
if(str1 == str2) System.out.println("Сроки равны");
(хотя, оно тоже
будет работать). Вместо этого следует использовать метод equals() класса String.
Другая пара методов:
int compareTo(String str) и int compareToIgnoreCase(String str)
также сравнивают
строки между собой, но в отличие от equals() они еще
позволяют узнать больше ли одна строка другой или нет. Если возвращаемое
значение этих методов больше 0, то первая строка больше второй, если меньше
нуля, то, наоборот, вторая больше первой. Если строки равны, то возвращается 0.
Для определения
больше или меньше одна строка, чем другая, используется лексикографический
порядок. То есть, например, строка "A" меньше, чем строка
"B", так как символ 'A' в алфавите стоит перед символом 'B'. Если
первые символы строк равны, то в расчет берутся следующие символы. Например:
String str1 = "hello";
String str2 = "world";
String str3 = "hell";
System.out.println(str1.compareTo(str2)); // -15 - str1 меньше чем str2
System.out.println(str1.compareTo(str3)); // 1 - str1 больше чем str3
System.out.println(str1.compareTo(str1)); // 0 - str1 равна str1
Еще один
специальный метод
regionMatches()
сравнивает
отдельные подстроки в пределах двух строк. Он имеет такие реализации:
boolean
regionMatches(int toffset, String other, int oofset, int len)
boolean
regionMatches(boolean ignoreCase, int toffset, String other, int oofset, int
len)
-
ignoreCase:
надо ли игнорировать регистр символов при сравнении (если значение true, то регистр
игнорируется);
-
toffset:
начальный индекс в вызывающей строке, с которого начнется сравнение;
-
other:
строка, с которой сравнивается вызывающая;
-
oofset: начальный
индекс в сравниваемой строке, с которого начнется сравнение;
-
len: количество
сравниваемых символов в обеих строках.
Например, ниже в
строке str1 сравнивается
подстрока wor с подстрокой wor строки str2:
String str1 = "Hello world";
String str2 = "I work";
boolean result = str1.regionMatches(6, str2, 2, 3);
System.out.println(result); // true
Поиск в строке
Метод indexOf() находит
индекс первого вхождения подстроки в строку, а метод lastIndexOf() - индекс
последнего вхождения. Если подстрока не будет найдена, то оба
метода возвращают -1:
String str = "Hello world";
int index1 = str.indexOf('l'); // 2
int index2 = str.indexOf("wo"); //6
int index3 = str.lastIndexOf('l'); //9
System.out.println(index1+" "+index2+" "+index3);
Метод startsWith() позволяют
определить начинается ли строка с определенной подстроки, а метод endsWith() позволяет
определить заканчивается строка на определенную подстроку:
String str = "myfile.exe";
boolean start = str.startsWith("my"); //true
boolean end = str.endsWith("exe"); //true
System.out.println(start+" "+end);
Замена в строке
Метод replace() позволяет
заменить в строке одну последовательность символов на другую:
String str = "Hello world";
String replStr1 = str.replace('l', 'd'); // Heddo wordd
String replStr2 = str.replace("Hello", "Bye"); // Bye world
System.out.println(replStr1);
System.out.println(replStr2);
Обрезка строк
Метод trim()
позволяет удалить начальные и конечные пробелы:
String str = " hello world ";
str = str.trim(); // hello world
System.out.println(str);
Метод
substring() возвращает подстроку, начиная с определенного индекса до конца или
до определенного индекса:
String str = "Hello world";
String substr1 = str.substring(6); // world
String substr2 = str.substring(3,5); //lo
System.out.println(substr1);
System.out.println(substr2);
Изменение регистра
Метод
toLowerCase() переводит все символы строки в нижний регистр, а метод
toUpperCase() - в верхний:
String str = "Hello World";
System.out.println(str.toLowerCase()); // hello world
System.out.println(str.toUpperCase()); // HELLO WORLD
Разбиение строки на подстроки
Метод split()
позволяет разбить строку на подстроки по определенному разделителю. Разделитель
– это какой-нибудь символ или набор символов (передается в качестве параметра).
Например, разобьем текст на отдельные слова (учитывая, что слова разделены
пробелом):
String text = "Я люблю язык Java!";
String[] words = text.split(" ");
for(String word : words)
System.out.println(word);