Как эта штука работает внутри?

Пожалуйста, следуйте приведенному ниже коду:

String s = "helloworld";
String ss = "hello";
String sss=ss+"world";
System.out.print(sss==s);

На выходе получается false. Разве они не проверяются правилом пула строк для String? А что, если мы сделаем их final?

Небольшое объяснение внутренней работы поможет. Заранее спасибо.

Строковые литералы указывают на одно и то же место, если их содержимое одинаково, это то, что я получил из разных источников, я прав? Если да, то что здесь происходит? Я немного запутался в этом.

Обновлено:-

Думаю, я неправильно это сформулировал. Позвольте мне немного перефразировать (извините за более раннюю попытку): -

    String ss = "hello";
    System.out.print(ss+"world"= = "helloworld");

Это возвращает false. Однако это строковые литералы, и, как я читал, они не создают два разных объекта для одного и того же значения. Они просто относятся к одному и тому же значению. Здесь helloworld - это значение для обеих сторон ==. Я надеюсь, что смогу хорошо это передать.

В качестве примечания, значения String всегда следует сравнивать с использованием .equals.

lealceldeiro 03.10.2018 19:03

Нет! автор думает о сравнении референций. Он заявляет: «helloworld» должен быть тем же экземпляром, что и результат «helloworld».

Jacek Cz 03.10.2018 19:07

«Строковые литералы указывают на одно и то же место, если их содержимое одинаково» - конечно, строка литералы, но ss+"world" не является строковым литералом.

user2357112 supports Monica 03.10.2018 19:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
65
1

Ответы 1

Поскольку String является объектом, сравнивается, что эти два объекта совпадают с ==, что приравнивается к false.

Использование объекта ss для объединения в sss не приведет к созданию s = sss.

Если вы установите ss на s, то использование == будет приравниваться к true, поскольку теперь они являются одним и тем же объектом.

Если вы установите второй объект String с помощью строкового литерала, использование == приравнивает к true.

Если вы используете функцию String объекта .equals(String), вы обнаружите, что она эквивалентна true.

Если вы сравните два строковых литерала, то есть "helloworld" == "helloworld" или "helloworld" == "hello" + "world", они также будут приравниваться к true.

Как указал Леалсельдейро, струны всегда следует сравнивать с .equals().

РЕДАКТИРОВАТЬ

Стоит посмотреть на этот ответ. Здесь есть хорошие ссылки и объяснения.

Другие источники:

ЖурналДев

Baeldung

Нет! Вопрос по ссылкам и пулу строк

Jacek Cz 03.10.2018 19:08

Но строковые литералы указывают на одно и то же место, если содержимое одинаково. Не так ли?

user4955530 03.10.2018 19:10

нет. это зависит от реализации JVM. вы не можете сказать равную строку из-за производительности, укажите один и тот же адрес. Вы можете заставить его использовать новый адрес примерно так (в зависимости от JVM): `System.out.println (new String (" a ") == new String (" a "))

Amin 03.10.2018 19:16

Другие вопросы по теме