8 июн. 2015 г.

Строки. Часть 5 – сравнение строк.

Еще раз напомню, что в Java, все кроме примитивных типов являются ссылочными типами. Сравнение строк рассмотрим на уже более или менее знакомом нам примере когда мы рассматривали создание строк класса String.

Str00033

Следует обратить особое внимание на сравнение строк s4 и s5, хотя их содержимое равно, но при сравнении s4==s5 мы получим false, так как это разные объекты и при использовании оператора сравнения (==) для строк, равно как и для любых других объектов, происходит сравнение ссылок, а данном случае они разные. Поэтому при сравнении объектов оператором == можно получить граблями по морде неожиданный эффект :)

Если же для сравнения использовать метод equals() класса String, то происходит сравнение содержимого объектов (строк). Так же надо учитывать что метод сравнения строк equals() регистро-зависимый, то есть строки "Hello" и "HELLO" для него будут разными.

Данная программа генерирует следующий вывод:

Str00034

Для того чтобы сравнивать строки не зависимо от  регистра символов существует метод equalsIgnoreCase().

Для сравнения строк существуют еще методы compareTo(String str)  и compareToIgnoreCase(String str). Данные методы сравнивают лексическое значение строки со строкой заданной в параметре str, определяя сортируются ли она в алфавитном порядке раньше или позже строки в параметре str. Методы возвращают целое число типа int, которое может быть меньше, равно или больше нуля. Данное число определяется по следующим правилам:

  1. Сравниваются символы данной строки this и строки str с одинаковым индексом (т.е. посимвольное сравнение строк), пока не встретятся различные символы с индексом, допустим, k или пока одна из строк не закончится.
  2. В первом случае возвращается значение this.charAt(k) — str.charAt(k) , т. е. разность кодировок Unicode первых несовпадающих символов.
  3. Во втором случае возвращается значение this.length() — str.length() , т. е. разность длин строк.
  4. Если строки совпадают, возвращается 0, т.е. в той же ситуации, в которой метод equals() возвращает true.
  5. Если значение str равно null, возникает исключительная ситуация.

Сравнение символов происходит строго по их расположению в таблице кодировки стандарта Unicode, то есть эти методы не учитывают алфавитное расположение символов в локальной кодировке.

Русские буквы расположены в Unicode по алфавиту, за исключением одной буквы. Заглавная буква Ё находится перед всеми кириллическими буквами, ее код ' \u0401' , а строчная буква ё — после всех русских букв, ее код '\u0451' .

Если вас такое расположение не устраивает, задайте свое размещение букв с помощью класса RuleBasedCollator из пакета java.text.

Теперь небольшой пример:

Str00035

Вывод этой программы следующий:

Str00036

В первом случае –3 получилось поскольку код символа а равен 97, а код символа d равен 100, 97-100=-3. После этого мы просто сравнили одинаковые строки и поэтому результат равен нулю. Затем случай противоположный первому 100-97=3. И последний случай это когда вычлась длина строки abc0 из длины строки abc, что равно –1.

 

Здесь мы рассмотрели основные принципы сравнения строк целиком и граблей которые при этом могут быть. В классе String существует еще несколько методов сравнения частей строк, но их мы рассмотрим чуть позже.

2 комментария:

  1. обертки прим. типов тоже по ссылке сравниваются

    ОтветитьУдалить
    Ответы
    1. Вот тут есть моя статья по этому поводу http://pr0java.blogspot.ru/2015/05/blog-post_97.html

      Удалить