При разработке любых программ программист сталкивается с задачей сравнить две строки между собой.
Стандартными средствами языка Java предусмотрено два способа сравнения строк между собой:
- Сравнение с помощью методов equals / equalsIgnoreCase
- Сравнение с помощью оператора равенства
Сравнение с помощью equals
Оператор String.equals()
сравнивает строки семантически. Две строки будут равны между собой лишь в том случае, если они содержат одинаковые наборы символов:
String s1 = "test string"; String s2 = "test string"; String s3 = "TEST string"; System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3));
В первом случае сравниваются между собой идентичные строки, поэтому в консоль будет выведено значение «true». Во втором же случае строки неидентичны, поэтому будет выведено значение «false».
Для того, чтобы сравнивать строки, игнорируя регистр букв, воспользуемся методом equalsIgnoreCase:
String s1 = "test string"; String s2 = "test string"; String s3 = "TEST string"; System.out.println(s1.equalsIgnoreCase(s2)); System.out.println(s1.equalsIgnoreCase(s3));
В данном случае в конмоль будет дважды выведено значение «true», так как строки равны между собой (игнорируя регистр букв).
Сравнение с помощью оператора равенства
Обычно строки в Java не сравниваются с помощью оператора равенства ==. А всё потому, что оператор равенства сравнивает именно значения переменных, но не строковые представления как таковые.
Рассмотрим следующий код:
String ps1 = "test string"; String ps2 = "test string"; String ps3 = new String("test string"); System.out.println(ps1 == ps2); System.out.println(ps1 == ps3);
Здесь мы создали две переменных ps1
и ps2
с помощью строковых литералов. Это значит, что компилятор ещё на этапе компиляции присвоит им значения объектов из пула строк. А так как строки идентичны, обе переменные будут ссылаться на один и тот же экземпляр строки в пуле строк. В первом случае оператор равенства вернёт значение true
, так как переменные ссылаются на один и тот же объект в памяти. Но всё обстоит иначе с переменной ps3
– ей присваивается значение новосозданного объекта new String("test string")
, который не имеет никакого отношения к пулу строк. Переменные ps1
и ps3
будут указывать на разные объекты в памяти. Следовательно, оператор равенства вернёт значение false
во втором случае.
Выводы
Для сравнения строк в Java используйте метода equals / equalsIgnoreCase, так как они сравнивают содержимой строковых обеъектов. Оператор равенства не используется для выявления идентичных строк, так как сравнивает значения переменных, которые указывают на объекты в памяти.