Как сравнить строки
Операция сравнения
==
сопоставляет только ссылки на строки. Она выясняет, указывают ли ссылки на одну и ту же строку. Например, для строк
String s1 = "Какая-то строка";
String s2 = "Другая-строка";
сравнение
s1 == s2
дает в результате
false
.
Значение
true
получится, только если обе ссылки указывают на одну и ту же строку, например, после присваивания
si = s2
.
Интересно, что если мы определим
s2
так:
String s2 == "Какая-то строка";
то сравнение
s1 == s2
даст в результате
true
, потому что компилятор создаст только один экземпляр константы "Какая-то строка" и направит на него все ссылки.
Вы, разумеется, хотите сравнивать не ссылки, а содержимое строк. Для этого есть несколько методов.
Логический метод
equals (object obj)
, переопределенный из класса
object
, возвращает
true
, если аргумент
obj
не равен
null
, является объектом класса
string
, и строка, содержащаяся в нем, полностью идентична данной строке вплоть до совпадения регистра букв. В остальных случаях возвращается значение
false
.
Логический метод
equalsIgnoreCase(object obj)
работает так же, но одинаковые буквы, записанные в разных регистрах, считаются совпадающими.
Например,
s2.equals("другая строка")
даст в результате
false
, а
s2.equalsIgnoreCase("другая строка")
возвратит
true
.
Метод
compareTo(string str)
возвращает целое число типа
int
, вычисленное по следующим правилам:
Сравниваются символы данной строки
this
и строки
str
с одинаковым индексом, пока не встретятся различные символы с индексом, допустим
k
, или пока одна из строк не закончится.
В первом случае возвращается значение
this.charAt(k) - str.charAt(k),
т. е. разность кодировок Unicode первйх несовпадающих символов.
Во втором случае возвращается значение
this.length() - str.length()
, т. е. разность длин строк.
Если строки совпадают, возвращается 0.
Если значение
str
равно
null
, возникает исключительная ситуация.
Нуль возвращается в той же ситуации, в которой метод
equals()
возвращает
true
.
Метод
compareToignoreCase(string str)
производит сравнение без учета регистра букв, точнее говоря, выполняется метод
this.toUpperCase().toLowerCase().compareTo(
str.toUpperCase().toLowerCase());
Еще один метод— compareTo
(Object obj)
создает исключительную ситуацию, если
obj
не является строкой. В остальном он работает как метод
compareTo(String str).
Эти методы не учитывают алфавитное расположение символов в локальной кодировке.
Русские буквы расположены в Unicode по алфавиту, за исключением одной буквы. Заглавная буква Ё расположена перед всеми кириллическими буквами, ее код '\
u040l
', а строчная буква е — после всех русских букв, ее код '\
u0451
'.
Если вас такое расположение не устраивает, задайте свое размещение букв с помощью класса
RuleBasedCollator
из пакета
java.text
.
Сравнить подстроку данной строки
this
с подстрокой той же длины
len
другой строки
str
можно логическим методом
regionMatches(int indl, String str, int ind2, int len)
Здесь
ind1
— индекс начала подстроки данной строки
this, ind2
— индекс начала подстроки другой строки
str
. Результат
false
получается в следующих случаях:
хотя бы один из индексов
ind1
или
ind2
отрицателен;
хотя бы одно из
ind1 + len
или
ind2 + len
больше длины соответствующей строки;
хотя бы одна пара символов не совпадает.
Этот метод различает символы, записанные в разных регистрах. Если надо сравнивать подстроки без учета регистров букв, то используйте логический метод:
regionMatches(boolean flag, int indl, String str, int ind2, int len)
Если первый параметр
flag
равен
true
, то регистр букв при сравнении подстрок не учитывается, если
false
— учитывается.