Да, если вы создаете две строки, такие как:
String a = "Hello";
String b = "Hello";
Они будут точно таким же объектом. Вы можете проверить это самостоятельно, выполнив
System.out.println (a == b);
Если это один и тот же объект, то их внутренняя ссылка на массив символов будет точно такой же.
Теперь, если вы сделали String c = "Hell" + "o";
, у него не было бы той же ссылки, так как она была бы (внутренне) построена с использованием StringBuilder.
Здесь много полезной информации здесь .
Соответствующие разделы имеют (Примечание: с этого сайта скопировано следующее):
Как уже упоминалось, существует два способа создания строки: неявное конструирование путем назначения литерала String или явное создание объекта String с помощью оператора new и конструктора. Например,
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object

Java разработала специальный механизм для хранения литералов String - в так называемом общем пуле строк. Если два строковых литерала имеют одинаковое содержимое, они будут использовать одни и те же места хранения в общем пуле. Этот подход принят для сохранения памяти для часто используемых строк. С другой стороны, объект String, созданный с помощью нового оператора, хранится в куче. Каждый объект String в куче имеет свое собственное хранилище, как и любой другой объект. В куче нет общего хранилища, даже если два объекта String имеют одинаковое содержимое.
Вы можете использовать метод equals () класса String для сравнения содержимого двух строк. Вы можете использовать оператор реляционного равенства '==' для сравнения ссылок (или указателей) двух объектов. Изучите следующие коды:
s1 == s1; // true, same pointer
s1 == s2; // true, s1 and s1 share storage in common pool
s1 == s3; // true, s3 is assigned same pointer as s1
s1.equals(s3); // true, same contents
s1 == s4; // false, different pointers
s1.equals(s4); // true, same contents
s4 == s5; // false, different pointers in heap
s4.equals(s5); // true, same contents
Изменить, чтобы добавить: Запустите эту SSCE, чтобы проверить равенство ссылок между двумя константными строками в разных классах:
class T {
String string = "Hello";
public static void main(String args[]) {
T t = new T();
T2 t2 = new T2();
System.out.println(t.string == t2.string);
}
}
class T2 {
String string = "Hello";
}
распечатывает true
.