| Сравнение объектов, часть 1-я - Сравнение строк |
|
|
Страница 1 из 3 Thursday, 08 June 2006 | 2006 Евгений Матюшкин aka Skipy (e-mail: skiрy mаil.ru) для раздела Ученье – свет В этой статье речь пойдет непосредственно о сравнении чисел, объектов, о частных случаях, тонкостях и неочевидных моментах. А если точнее, мы поговорим вот о чем:Сравнение строк: '==' и equals
Метод String.intern
Сравнение вещественных примитивов
Итак, приступим!
Сравнение строк: '==' и equals
Ах, эти строки... Один из наиболее часто используемых типов, вызывающих при этом немало проблем. Когда-нибудь я обязательно посвящу им отдельную статью. А пока я коснусь вопросов сравнения.
Разумеется, строки можно сравнивать с помощью equals. Более того, их НУЖНО сравнивать через equals. Однако, есть тонкости, которые стоит знать.
Прежде всего, одинаковые строки на самом деле являются единственным объектом. В чем легко убедиться, выполнив следующий код:
String str1 = "string";
String str2 = "string";
System.out.println(str1==str2 ? "the same" : "not the same");
Результатом будет "the same". Что означает, что ссылки на строки равны. Это сделано на уровне компилятора, очевидно, для экономии памяти. Компилятор создает ОДИН экземпляр строки, и присваивает str1 и str2 ссылку на этот экземпляр1.
Однако, это относится только к строкам, объявленным как литералы, в коде. Если скомпоновать строку из кусков, ссылка на нее будет другой. Подтверждение - данный пример:
String str1 = "string";
String str2 = "str";
String str3 = "ing";
System.out.println(str1==(str2+str3) ? "the same" : "not the same");
Результатом будет "not the same". Также можно создать новый объект с помощью копирующего конструктора:
String str1 = "string";
String str2 = new String("string");
System.out.println(str1==str2 ? "the same" : "not the same");
Результатом также будет "not the same".
Таким образом, иногда строки можно сравнивать и через сравнение ссылок. Но на это лучше не полагаться.
Я хотел бы затронуть один весьма любопытный метод, который позволяет получить так называемое каноническое представление строки - String.intern. Поговорим о нем поподробнее.
|
|||||