строка без соответствующего объекта в строковом константе при использовании метода intern возвращает ссылку на тот же объект - PullRequest
0 голосов
/ 05 сентября 2018

Строки без соответствующих объектов в пуле строковых констант при использовании метода intern возвращает ссылку на тот же объект, присутствующий в куче. Не предполагается ли возвращать ссылку на совершенно другой объект, который был недавно создан методом intern внутри пула констант String? Рассмотрим данный фрагмент кода.

class  Test{
public static void main(String[] args) {
    String s1 = new String("durga");
    String s2 = s1.concat("software");
    String s3 = s2.intern();
    System.out.println(s2 == s3);
    String s4 = "durgasoftware";
    System.out.println(s3 == s4);
 }
}

ввод: глубокий (мастер *) LanguagePackageInJava $ javac Lecture14.java
deep (master *) LanguagePackageInJava $ java Test
вывод: true
правда

Как выходные данные первого оператора печати верны? По моему мнению, s2 является объектом области кучи, в то время как s3 должен быть объектом области пула строковых констант. Как они оба могут указывать на один и тот же объект?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Причина в том, что значение s2 используется как "intern" . Объект просто засовывается в бассейн для повторного использования. Ниже я ожидаю других результатов, сначала интернируя одну и ту же строку s0.

String s0 = "durga".concat("software").intern();
String s1 = "durga";
String s2 = s1.concat("software");
String s3 = s2.intern();
System.out.println(s2 == s3); // false
System.out.println(s3 == s0); // true

В истории реализация intern изменилась. В начале пул строк находился в «постоянной памяти», возможно, загромождая эту память. Вследствие этого теги XML, которые были обработаны синтаксическими анализаторами XML, вместо этого использовали свое собственное отображение.

Надеюсь, код действительно выдает false + true.

0 голосов
/ 05 сентября 2018

Как вы можете видеть в Java DOC :

Возвращает каноническое представление для строкового объекта. [...] Когда вызывается метод intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.

Таким образом, на самом деле он сначала интернирует строку, на которую ссылается s2, а затем возвращает эту ссылку (сохраняя ее в s3). В результате s2 и s3 указывают на один и тот же объект.

Если пул строк уже содержит строку (попробуйте ее, переместив оператор String s4 = "durgasoftware" в начало метода), вместо этого она возвращается, и строка, на которую ссылается s2, равна , а не интернированы. Это дает другой результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...