Задать вопрос
@artemfisher

Почему способ создания String влияет на результат сравнения?

Добрый день!
1. Вернет “no”.
String s1=new String("Hello");
String s2=new String("Hello");
          
if(s1==s2)
System.out.println("yes");
else
System.out.println("no");


2. Вернет “yes”.
String s1="Hello";
String s2="Hello";
          
if(s1==s2)
System.out.println("yes");
else
System.out.println("no");


Почему?
  • Вопрос задан
  • 90 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
Потому, что Java String pool
(вопрос встречается на собеседованиях, кстати)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Vamp
@Vamp
Компилятор на этапе компиляции видит, что у вас в исходнике записаны две одинаковые строки и делает маленькую оптимизацию, которая, если выражать кодом, выглядит так:
String s0="Hello";
String s1=s0;
String s2=s0;
          
if(s1==s2)
System.out.println("yes");
else
System.out.println("no");

Здесь фактически в памяти существует одна строка и три ссылки на неё.

И пример с конструкторами:
String s0="Hello";
String s1=new String(s0);
String s2=new String(s0);
          
if(s1==s2)
System.out.println("yes");
else
System.out.println("no");

В этом примере используется конструктор, который копирует передаваемую в аргументе строку. Получается в памяти уже три объекта строки (с совпадающим контентом) и на них три отдельные ссылки. Так как ссылки указывают на разные объекты, то и результат их прямого сравнения выдаёт no.
Ответ написан
Комментировать
@artem-dainov
Php, java, js. Boot spring, jquery, git
Потому что String str1 = "hello";
String str2 = "hello";
это один и тот же объект. Переменные имеют ссылку на него. Это пул строк в java.
А если создавать через конструктор, то мы принуждаем к тому, чтобы специально создать два разных объекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы