Сравнение двух строк и их ссылок - PullRequest
0 голосов
/ 08 ноября 2011

С одной стороны;

String first = "thing";

String second = "thing";

if(first == second)

System.out.print( "Same things" );    //this is printed

С другой стороны;

String first = "thing";

String second = new String("thing");

if(first == second)
{
 System.out.print("Same things");
}
else
{
 System.out.print("Different things"); //This is printed
}

Я знаю, что оператор "==" использует для сравнения ссылок двух объектов,но в первом примере я сравнивал значения объектов напрямую.Я знаю, что такое сравнение неточно.Но почему я получаю сообщение в первом примере?Это показатель того, что ссылки совпадают или это произошло по совпадению?

Ответы [ 6 ]

3 голосов
/ 08 ноября 2011

в первом примере String pool использовалось - если вы не используете ключевое слово new - каждый новый экземпляр String попадает в этот пул, и если String с тем же значением создается - новый объект не создается - этотна бассейн используется.

0 голосов
/ 08 ноября 2011

строковые литералы интернированы вы также получите сообщение с

String first = "thing";

String second = new String("thing");

if(first.intern() == second.intern())
{
 System.out.print("Same things"); //This is printed
}
else
{
 System.out.print("Different things");
}
0 голосов
/ 08 ноября 2011

В первом случае first и second имеют одинаковые ссылки.

Но во втором у них разные ссылки.

С == вы фактически сравниваете значения в переменных first и second, которые являются ссылками на строковые объекты. Вы не сравниваете сами объекты. Что будет сделано с использованием метода equals.

0 голосов
/ 08 ноября 2011

В первом примере Java назначает точно один и тот же объект первому и второму.

Во втором примере Java создает новый объект 'second' (который внутренне указывает на первый).Итак, у вас есть два строковых объекта: первый и второй, но второй внутри содержит ссылку на первый.

См. Документацию для String # intern () .Отсюда:

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

Когда вызывается метод intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), то строка из пула возвращается.В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.

Из этого следует, что для любых двух строк s и t s.intern () == t.intern () имеет видЗначение true, если и только если s.equals (t) имеет значение true.

Все литеральные строки и строковые константные выражения интернированы.Строковые литералы определены в §3.10.5 Спецификации языка Java

0 голосов
/ 08 ноября 2011
String first = "thing";

String second = new String("thing");

if(first.equals(second))
{
 System.out.print("Same things");
}
else
{
 System.out.print("Different things"); //This is printed
}

Это должно быть работой.

0 голосов
/ 08 ноября 2011

Я думаю, что именно так Java оптимизирует, кэшируя строки, созданные с помощью этого метода:

String second = "thing";

И поэтому делает их "равными".

При этом:

String second = new String("thing");

Вы явно выделяете новую строку с этим содержимым, что делает ваше условие if ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...