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