Пожалуйста, следуйте приведенному ниже коду:
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 - это значение для обеих сторон ==. Я надеюсь, что смогу хорошо это передать.
Нет! автор думает о сравнении референций. Он заявляет: «helloworld» должен быть тем же экземпляром, что и результат «helloworld».
«Строковые литералы указывают на одно и то же место, если их содержимое одинаково» - конечно, строка литералы, но ss+"world" не является строковым литералом.




Поскольку String является объектом, сравнивается, что эти два объекта совпадают с ==, что приравнивается к false.
Использование объекта ss для объединения в sss не приведет к созданию s = sss.
Если вы установите ss на s, то использование == будет приравниваться к true, поскольку теперь они являются одним и тем же объектом.
Если вы установите второй объект String с помощью строкового литерала, использование == приравнивает к true.
Если вы используете функцию String объекта .equals(String), вы обнаружите, что она эквивалентна true.
Если вы сравните два строковых литерала, то есть "helloworld" == "helloworld" или "helloworld" == "hello" + "world", они также будут приравниваться к true.
Как указал Леалсельдейро, струны всегда следует сравнивать с .equals().
РЕДАКТИРОВАТЬ
Стоит посмотреть на этот ответ. Здесь есть хорошие ссылки и объяснения.
Другие источники:
Нет! Вопрос по ссылкам и пулу строк
Но строковые литералы указывают на одно и то же место, если содержимое одинаково. Не так ли?
нет. это зависит от реализации JVM. вы не можете сказать равную строку из-за производительности, укажите один и тот же адрес. Вы можете заставить его использовать новый адрес примерно так (в зависимости от JVM): `System.out.println (new String (" a ") == new String (" a "))
В качестве примечания, значения
Stringвсегда следует сравнивать с использованием.equals.