Иллюстрированный самоучитель по Java
Как
сравнить строки
Операция сравнения
==
сопоставляет только ссылки на строки. Она выясняет, указывают ли ссылки
на одну и ту же строку. Например, для строк
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
— учитывается.