#java #constants #heap-memory #string-pool
#java #константы #куча-память #пул строк
Вопрос:
как переместить данные области кучи в постоянный пул строк?
String s3 = new String("Test");
final String s4 = s3.intern();
System.out.println(s3 == s4);//fasle(i need true)
я не хочу создавать новый объект, поэтому просто вырежьте объект из кучи и вставьте его в постоянный пул строк
Комментарии:
1.
System.out.println(s3.equals(s4))
. Другими словами, не сравнивайте ссылки, сравнивайте данные. Я не вижу необходимости сравниватьString
ссылки (кроме tonull
), и если вы считаете, что вам это нужно, вы, вероятно, неправильно разработали свою программу. Чтобы ответить на ваш вопрос,s3.intern()
создается новый объект, и, следовательно, ссылки никогда не будут равны.2. я не хочу создавать новый объект, поэтому просто вырежьте объект из кучи и вставьте его в постоянный пул строк.
3. Почти все в Java является объектом. Java — это не Microsoft Word, и вы не можете просто «вырезать и вставлять» данные без создания нового объекта. Вам действительно нужно вернуться и изучить основы Java.
Ответ №1:
Вы не перемещаете данные кучи в пул строковых констант при вызове intern
, вы просто добавляете еще одну новую строку в пул констант, если она еще не существует в пуле констант (чего в вашем случае не происходит, поскольку "Test"
она уже добавлена в пул констант в строке -1).
Возможно, вы захотите изменить свой код на :
public static void main(String[] args) {
String s3 = new String("Test");
s3 = s3.intern();
String s4 = "Test";
System.out.println(s3 == s4);//fasle(i need true)
}
В приведенном выше коде вы снова присваиваете ссылку на интернированное значение s3 на s3. Затем вы получаете тот же объект из пула строковых констант в S4.
Комментарии:
1. я хочу переместить (вырезать) данные области кучи в постоянный пул строк? но когда я использую intern, он просто копирует объект..
2. я не хочу создавать новый объект, поэтому просто вырежьте объект из кучи и вставьте его в постоянный пул строк
3. @ShivarajMc — Ну, после запуска GC строка
Test
, которая находится в куче, будет иметь право на GC. Таким образом, вы косвенно выполняете вырезание-вставку одного и того же объекта с некоторой задержкой4. @ShivarajMc — Вы не можете «переместить» объект из одного места в другое (JIT может это сделать, если захочет).
5. ваш правильный …. («Тест» уже добавлен в пул констант в строке -1)