как переместить данные области кучи в постоянный пул строк?

#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 ссылки (кроме to null ), и если вы считаете, что вам это нужно, вы, вероятно, неправильно разработали свою программу. Чтобы ответить на ваш вопрос, 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)