Ответ
При создании строки через литерал (String s = "text") JVM сначала проверяет String Pool (область heap memory). Если идентичная строка уже существует, возвращается ссылка на существующий объект из пула. Если нет — строка создается и помещается в пул, после чего возвращается ссылка на новый объект.
Пример с литералами:
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // true (обе ссылки указывают на один объект в пуле)
При использовании оператора new создается новый объект в куче (heap), даже если идентичная строка уже есть в пуле. Его можно явно поместить в пул с помощью метода intern().
Пример с new:
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3 == s4); // false (разные объекты в heap)
System.out.println(s3.intern() == s1); // true (s3.intern() возвращает ссылку из пула)
Практическое правило: Используйте строковые литералы для констант и повторяющихся значений, чтобы экономить память. Избегайте new String("literal"), так как это создает лишний объект.