Иллюстрированный самоучитель по 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

— учитывается.


Содержание раздела