Сравнение строк

Класс String включает несколько методов, которые сравнивают строки или подстроки внутри строк.

· Методы equals() и equalsIgnoreCase()

Чтобы сравнить две строки на равенство, нужно использовать метод equals:

String s1 = "Hello";

String s2 = "hello";

boolean isEqual = s1.equals(s2); // false

Этот метод возвращает true, если строки содержат одни и те же символы в одинаковом порядке, иначе возвращает false. В показано примере результатом будет false, так как этот метод чувствителен к регистру символов.

Чтобы выполнить сравнение, которое игнорирует различия в регистре, вызывается метод equalsIgnoreCase():

String s1 = "Hello";

String s2 = "hello";

boolean isEqual = s1.equalsIgnoreCase(s2); // true

В данном случае результат будет true.

· Методы startsWith() и endsWith()

Метод startsWith() определяет, начинается ли строка с указанной в параметре строки. Наоборот, метод endsWith() определяет, заканчивается ли строка указанной в параметре строкой. К примеру:

String s = "hello";

boolean a = s.startsWith("hel"); // true

boolean b = s.endsWith("llo"); // true

Вторая форма метода с помощью второго параметра (startIndex) позволяет определить начальную точку области сравнения:

boolean startsWith(String str, int startIndex)

Например:

String s = "hello";

System. out. println(s.startsWith("llo", 2)); // выведет true

Сравнение equals() и операции ==

Важно понять, что метод equals() и оператор == выполняют два различных действия. Метод equals() сравнивает символы внутри строк, а оператор == две переменные-ссылки, чтобы определить, обращаются они к одному и тому же объекту.

В простых типах, изученных ранее, таких как int, double, char и т.п., переменная сама хранила значение. В объектных типах, таких как String, и остальных, которые создаются при помощи операции new, переменная является ссылочной, то есть она хранит только адрес в памяти, где на самом деле хранятся данные.

В следующем примере показано, что два различных String-объекта могут содержать одни и те же символы, но ссылочные переменные на эти объекты не будут оцениваться как равные:

String s1 = new String("Hello");

String s2 = new String("Hello");

System. out. println(s1 + " равен " + s2 + " -> " + s1.equals(s2));

System. out. println(s1 + " == " + s2 + " -> " + (s1 == s2));

Вывод в консоль:

Hello равен Hello -> true

Hello == Hello -> false

Содержимое двух String-объектов идентично, но это – разные объекты. Переменные s1 и s2 не ссылаются на один и тот же объект, и поэтому, при сравнении с помощью операции == оказываются не равными.

Однако, если мы создаем строки без помощи ключевого слова new, результат будет другой:

String s1 = "Hello";

String s2 = "Hello";

System. out. println(s1 + " равен " + s2 + " -> " + s1.equals(s2));

System. out. println(s1 + " == " + s2 + " -> " + (s1 == s2));

Вывод в консоль:

Hello равен Hello -> true

Hello == Hello -> true

Это происходит, потому что на этапе компиляции компилятор видит одинаковые строки-константы “Hello”, при этом нет указания создавать новый объект (операция new ), поэтому в памяти создастся одна строка “Hello”, и на нее будут ссылаться обе переменные.




double arrow
Сейчас читают про: