Сравнение строк с ==, которые объявлены окончательными в Java



Answers

Согласно моим исследованиям, все final String интернированы на Java. Из одного из сообщений в блоге:

Итак, если вам действительно нужно сравнить две строки, используя == или! =, Перед вызовом сравнения вы вызываете метод String.intern (). В противном случае всегда предпочитайте String.equals (String) для сравнения String.

Таким образом, это означает, что если вы вызываете String.intern() вы можете сравнить две строки, используя == operator. Но здесь String.intern() не требуется, потому что в Java final String внутренне интернированы.

Вы можете найти более подробную информацию Сравнение строк с использованием оператора == и Javadoc для String#intern() .

Также обратитесь к этому сообщению Stackoverflow для получения дополнительной информации.

Question

У меня есть простой вопрос о строках в Java. Следующий сегмент простого кода просто объединяет две строки и затем сравнивает их с == .

String str1="str";
String str2="ing";
String concat=str1+str2;

System.out.println(concat=="string");

Выражение сравнения concat=="string" возвращает false как очевидное (я понимаю разницу между equals() и == ).

Когда эти две строки объявлены final ,

final String str1="str";
final String str2="ing";
String concat=str1+str2;

System.out.println(concat=="string");

Выражение сравнения concat=="string" , в этом случае возвращает true . Почему final имеет значение? Нужно ли что-то делать с помощью пула или просто вводить в заблуждение?




Хотя при создании с использованием строковой литературной нотации Java он автоматически вызывает метод intern (), чтобы поместить этот объект в пул строк, если он уже не присутствует в пуле.

Почему окончательное значение имеет значение?

Компилятор знает, что конечная переменная никогда не изменится, когда мы добавим эти конечные переменные, выходные данные передаются в String Pool из-за вывода выражения str1 + str2 также никогда не изменится, поэтому компилятор вызывает метод inter после вывода двух последних конечных переменных. В случае не конечного компилятора переменных не вызывайте метод intern.




Концепция пула и строки conts pool




Links