java println (a == b + is + a == b) печатает false вместо a == b is true

Возможные дубликаты:
Получение странного вывода при печати результата сравнения строк

Всем привет,

System.out.println() по-другому ведет себя со строками. Кто-нибудь может объяснить, почему

См. Фрагмент кода ниже

String a ="hello"
String b ="hello"

System.out.println("a==b"+"is"+a==b)

Я ожидаю, что это напечатает 'a==b is true', но он просто напечатает false, и я не знаю почему.


person mahati    schedule 05.02.2011    source источник
comment
Фактически, большинство современных компиляторов Java объединяют строковые литералы, поэтому они могут фактически печатать a==b is true, хотя это чистая удача, и, как все уже упоминали, .equals() - это то, как вы должны сравнивать   -  person davin    schedule 05.02.2011
comment
@davin: нет, его пример просто печатает false, потому что a конкатенируется с "a==b"+"is", и это сравнивается с b с использованием ==.   -  person Bart Kiers    schedule 05.02.2011
comment
@ Барт, когда я комментировал вопрос, вопрос был не таким. Ваш комментарий и мой, очевидно, не синхронизированы, я изящно убью свою ветку («ветку» в смысле программирования, а не в смысле форума), мало интересовавшийся вопросом, я просто указывал на побочный факт, хотя со всеми этими изменениями , это уже не актуально.   -  person davin    schedule 05.02.2011
comment
@davin, JVM требуется по спецификации для создания идентичных объектов для одинаковых строковых литералов (и только литералов), так что на самом деле ответ Барта здесь единственно правильный.   -  person Sergei Tachenov    schedule 05.02.2011
comment
@ Сергей, ты прочитал, что я написал? Изменилось содержание вопроса. Я не комментировал ответы ...   -  person davin    schedule 05.02.2011
comment
Не дубликат. Речь идет о приоритете операторов, а не о сравнении строк.   -  person finnw    schedule 05.02.2011
comment
@davin, я увидел твой комментарий только после того, как опубликовал свой. Тем не менее, мой комментарий не имеет ничего общего с содержанием вопроса. Я говорил о чистой удаче в вашем комментарии. Это не чистая удача. Идентичные строковые литералы должны быть представлены одним и тем же объектом. Это не зависит от реализации. Если они не буквальные (как в текущей версии вопроса), это другая история.   -  person Sergei Tachenov    schedule 05.02.2011
comment
@Sergey, пожалуйста, сделайте мне одолжение, вы действительно думаете, что я предполагал, что решения компилятора - это буквально чистая удача? Я имел в виду тот факт, что в отношении результата a == b, где a, b - строки, почти всегда ложно, даже если a.equals (b), хотя в случае, когда это был текущий вопрос, это оказалось правдой , что было удачным, потому что ОП сказал, что он ожидал правды. Не придирайтесь.   -  person davin    schedule 05.02.2011
comment
@david, о, понятно, вы говорили об общем случае. Меня смутила фраза «самые современные строковые литералы пула компиляторов Java».   -  person Sergei Tachenov    schedule 05.02.2011
comment
Извините, я проголосовал за закрытие, прежде чем понял, что речь идет не о сравнении строк, а о том, что a конкатенировался до сравнения с b. Проголосовали за повторное открытие.   -  person Bart Kiers    schedule 05.02.2011


Ответы (3)


Печатается единственная ложь, потому что вы не сгруппировали свое логическое выражение.

Выражение:

"a==b"+"is"+a==b

оценивается как

("a==b"+"is"+a) == (b)

в то время как вы хотели, чтобы он выполнял конкатенацию строк:

"a==b"+"is"+ (a==b)

Тем не менее, вы не должны сравнивать строки с использованием ==, как указывали другие.

person Bart Kiers    schedule 05.02.2011
comment
@mahati, пожалуйста. - person Bart Kiers; 05.02.2011

проблема не в System.out.println (); это что-то со сравнением строковых объектов с ==. Используйте метод .equals() для сравнения двух строковых объектов. См. Ссылку ниже. Сравнение строковых объектов

person R K    schedule 05.02.2011
comment
с помощью System.out.println (); это что-то со сравнением объектов String с == Use .equals() - Не могли бы вы предоставить ссылку, которая поддерживает ваше утверждение? Если так, я удалю свой -1, но я почти уверен, что это неверно. - person Bart Kiers; 05.02.2011
comment
Ссылка на строковый объект будет сравниваться, если мы используем == !!! Я не упомянул, что == у сравнения есть проблема, я упомянул, что использование == приводит к проблеме. Мы можем не получить фактический результат, если будем использовать == для сравнения строк. - person R K; 07.02.2011

Это может быть потому, что он передает a и b как разные объекты. Когда мы создаем такие строки, это относится к разным пулам строк.

person Chirag Tayal    schedule 05.02.2011
comment
Есть только один пул строк (и это не ошибка в этом вопросе). - person finnw; 05.02.2011