Ответ
Да, для строковых литералов — гарантировано. При использовании литералов Java помещает их в String Pool (heap) и возвращает ссылку на существующий объект при повторном использовании того же литерала.
Однако, это не гарантируется для строк, созданных:
- Через конструктор
new String(). - Динамически (например, конкатенацией во время выполнения).
Пример:
String s1 = "hello"; // Гарантированно из пула
String s2 = "hello"; // Ссылка на тот же объект, что и s1
String s3 = new String("hello"); // Новый объект в куче, вне пула
String s4 = s3.intern(); // Помещаем значение в пул и получаем ссылку
System.out.println(s1 == s2); // true (одна ссылка)
System.out.println(s1 == s3); // false (разные объекты)
System.out.println(s1 == s4); // true (s4 теперь ссылается на объект из пула)
Практическое правило: Для гарантированного получения строки из пула используйте метод intern(), но учитывайте его потенциальные накладные расходы на производительность и память.