Из вашего комментария:
Я скопировал это из другой коменатрии: Но для экономии памяти мы используем StringPool. Если у нас одно и то же значение, то ссылка та же самая, она работает только для создания String
не конструктором. Если бы у меня было String s = new String("a"); String s2 = new String("a");
, я использовал бы 2 пробела в памяти, но когда я использовал String s = "a"; String s2 = "a"
, я использовал бы 1 пробел в памяти. То есть это означает toString()
return «new String ()»?
Ваш источник должен был сказать:
... он работает только для создания String
с использованием строковые литералы.
Таким образом, это могло бы быть яснее, потому что есть много способов создания новых String
объектов без непосредственного вызова конструктора. Строковые литералы - это те вещи, которые окружены "
(включая кавычки), такие как "a"
или "b"
или "Welcome to Stack Overflow"
.
Только строковые литералы 1 объединяются автоматически. Вы можете вручную поместить строку в пул, вызвав intern()
.
Когда вы объединяете две строки (например, stringA + stringB
), обычно создается новая строка, как описано здесь .
Теперь давайте посмотрим, что делает Object.toString
:
Метод toString для класса Object возвращает строку, состоящую из имени класса, для которого Объект - это экземпляр, символ знака @ и шестнадцатеричное представление без знака хеш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Обратите внимание, что строки объединяются здесь, поэтому здесь создается новый строковый объект, следовательно, вывод.
И чтобы ответить на вопрос:
Значит, toString()
return "new String ()"?
Да, но не напрямую. Компилятор превратит операторы +
в Object.toString
в некоторый код, используя StringBuilder
(точнее, «компилятор превратил ...», так как класс Object
уже скомпилирован) , В конце она вызовет StringBuilder.toString
, и это создаст новый объект String
.
1 Постоянные выражения строк, чтобы быть более точными .