В Java вы можете создавать объекты String без вызова нового оператора. Так, String str1 = "hello"
эквивалентно String str1 = new String("hello")
. Это делается так, чтобы объявление строки было похоже на примитивные типы данных.
относительно того, почему они ссылаются на одну и ту же ячейку памяти:
В Java существует концепция Пул литералов строк . Чтобы сократить количество объектов String, созданных в JVM, класс String хранит пул строк. Каждый раз, когда ваш код создает строковый литерал, JVM сначала проверяет пул строкового литерала. Если строка уже существует в пуле, возвращается ссылка на объединенный экземпляр. Если строка не существует в пуле, создается новый объект String, а затем помещается в пул.
String str1 = "Hello";
String str2 = "Hello";
System.out.print(str1 == str2);
Отпечатки True
.
Если вы делаете:
String str1 = "Hello";
String str2 = new String("Hello");
System.out.print(str1 == str2);
Отпечатки False
.
потому что объект String создается из литерального пула String.