Главная » Java » Равнозначность строковых литералов Java

0

Оператор ==, применяемый для сравнения строк, вообще говоря, дает неверные результаты. Рассмотрим пример:

if (str == "2,pena?")

answer(str);

Такой код не позволяет сравнивать содержимое двух строк – напротив, он сопоставляет одну объектную ссылку (str) с другой (строковым объектом, представляемым литералом " 2, Репа?"). Даже если Str действительно содержит строку " 2, Репа?", оператор == все равно почти всегда возвратит false, поскольку две строки принадлежат совершенно различным объектам. Оператор == на самом деле позволяет проверить только тот факт, указывают ли две ссылки на один и тот же объект, и не предназначен для контроля равнозначности содержимого объектов.

Однако принято считать, что два строковых литерала с одинаковым содержимым указывают на один и тот же объект String. В рассмотренном ниже случае оператор == будет действовать верно.

String str = "2,pena?"; //

if (str == "2,pena?")

answer(str);

Поскольку переменная str изначально проинициализирована литеральным значением, сопоставление ее с другим строковым литералом равносильно сравнению содержимого двух строк. Впрочем, будьте внимательны – подобный код работает корректно только в тех случаях, когда ссылки действительно указывают на строковые литералы. Если в процессе выполнения про граммы ссылка Str была изменена и теперь указывает на объект String, созданный динамически (например, в результате ввода пользователем последовательности символов), оператор == возвратит false даже в том случае, если пользователь ввел ту же строку – "2, Репа?".

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии