2013-05-03 4 views
-1

System.out.print("a".replace('a','1')=="a".replace('a','1'));Строка замены(), возвращаемое значение сравнение с помощью «==»

true Ожидалось, как заменить() возвращает строку и сравнение строк можно с ==. Но вышеприведенный код печатает false. Объяснения?

+1

Вы не должны сравнивать строки в java с '=='. Он проверяет, совпадают ли их ссылки, а не их значения. –

+0

Я поняла концепцию ** String Interning ** через вышеупомянутый пост сэром Nizet. В этом причина 'S.O.Pln (" a "==" a ");' return 'true'. Спасибо всем за ваше время и сотрудничество. :) –

ответ

4

== проверяет, являются ли они одним и тем же объектом в памяти, поэтому в том же месте.

Поскольку это две различные строки, которые просто имеют одинаковый контент, который вам нужно сравнить с .equals, который сравнивает значения, а не ссылки.

+0

Или, если вы хотите сравнить числа, которые вы их заменяете, вам нужно проанализировать эту новую замену и THEN вы можете использовать '==' – aug

+0

Sir Jean: SOPln ("ab" == "ab"). ; возвращает 'true'. Разделяют ли они одну и ту же память? –

+1

@ChaZ В этом случае да, потому что они известны во время компиляции, поэтому им дается статическое местоположение в памяти и не создается во время выполнения. Это сложный случай. Чтобы быть в безопасности, всегда сравнивайте строки с .equals, если вы специально не знаете, что вы заботитесь о местоположении памяти. –

1

Нет, сравнение строк не рекомендуется с помощью ==. В некоторых случаях, например:

new String("test") == new String("test") 

он возвращает false.

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

Это очень важно всегда использовать метод «equals» вместо == !!

+1

Я бы зашел так далеко, чтобы сказать в * большинстве случаев, что тест равенства вернет false. – stevevls

+4

Я бы зашел так далеко, чтобы не использовать '==' для сравнения строк. –

+0

Согласовано. Был академический вопрос, вот почему я спросил. Btw why 'S.O.Pln (" ab "==" ab ");' возвращает 'true'? Думаю, они не разделяют память. –

Смежные вопросы