Два вопроса.
Когда мы объявляем буквальные строки, мы ищем, есть ли такая же строка в пуле строк кучи. Это тоже интернирование (метод стажировки класса String
)?
На мой взгляд, каждое объявление литеральной строки требует бинарного поиска или чего-то подобного, поэтому оно стоит не менее log (n ) , когда n - количество существующих строк в пуле. А если в пуле много струн, это может стоить дорого. (возможно, компромисс между стоимостью поиска и памятью?) С этой точки зрения может быть опасно объявлять буквальные строки mant. Насколько велика эта стоимость поиска и почему java спроектирована таким образом (пул поиска при объявлении буквальных строк).
Ниже приводится то, что я упомянул, чтобы понять предысторию.
JavaDoc для java.lang.String
класс утверждает:
Строки постоянны; их значения не могут быть изменены после создания. Буферы строк поддерживают изменяемые строки. Поскольку объекты String неизменяемы, они могут использоваться совместно.
http://www.janeg.ca/scjp/lang/strLiteral.html комментарии:
Другими словами, поскольку компилятор знает, что исходное значение строки не может быть изменено после его создания, он может безопасно использовать существующие данные и избегайте загромождения памяти дубликатами.