Строки в Java, методы класса String

Для работы со строками в 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 = str3;

что означает изменение ссылки 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. Первый метод, как написано, возвращает длину строки. Например, если нам дана вот такая строка

String str1 = "Java";

то метод length() вернет значение 4

System.out.println(str1.length()); // 4

Далее, если к строке str2

String str2 = "Hello World!";

применить метод toCharArray():

char[] helloArray = str1.toCharArray();

то получим массив символов с содержимым этой строки. Следующий пример. У нас есть пустая строка

String s = "";

тогда мы можем определить это, например, так:

if(s.length() == 0) System.out.println("String is empty");

или так:

if(s isEmpty()) System.out.println("String is empty");

Но, если строка задана вот так:

String s = null;

то это означает, что ссылка s не указывает ни на какой класс String и, соответственно, мы не можем вызывать методы этого класса. В этом случае проверку следует делать так:

if(s != null && s.length() == 0) System.out.println("String is empty");

мы здесь сначала проверяем: указывает ли ссылка s на объект класса и если это так, то только потом будет идти обращение к методу length().

Объединение строк

Для соединения строк можно использовать операцию сложения ("+"):

String str1 = "Java";
String str2 = "Hello";
String str3 = str1 + " " + str2;
 
System.out.println(str3); // Hello Java

При этом если в операции сложения строк используется не строковый объект, например, число, то этот объект преобразуется к строке:

String str4 = "Год " + 2015;

Еще один метод объединения - метод join() позволяет объединить строки с учетом разделителя. Например, две строки

String str1 = "Java";
String str2 = "Hello";

будут сливаться в одно слово "HelloJava", если их объединить с помощью оператора +:

String str3 = str1 + str2;

но если мы хотим, чтобы две подстроки при соединении были разделены пробелом, то можно воспользоваться методом join() следующим образом:

String str3 = String.join(" ", str2, str1); // Hello Java

В общем случае вместо пробела здесь можно ставить любой разделитель в виде строки.

Обратите внимание, что каждый раз при объединении строк мы получали новую строку как результат объединения.

Извлечение символов и подстрок

Для извлечения символов по индексу в классе 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);