Прежде всего, мы должны прояснить, что в методе стажировки класса String в JDK1.6 и JDK1.7 все еще есть разница в стажере.
Стажер в JDK1.6:
Во -первых, при вызове метода стажировки перейдите в постоянный пул, чтобы увидеть, есть ли значение такого же значения, как существует текущее значение строки. Если он существует, он напрямую вернет ссылку на строковое значение в постоянном пуле; Если его не существует, строка из исходной кучи будет скопирована в постоянный бассейн.
Стажер в JDK1.7:
Во -первых, при вызове метода стажировки перейдите в постоянный пул, чтобы увидеть, есть ли значение такого же значения, как существует текущее значение строки. Если он существует, он напрямую вернет ссылку на строковое значение в постоянном пуле; Если его не существует, он только поместит ссылку на исходную кучу в постоянном пуле и не скопирует всю строку в постоянный пул.
Это означает, что JDK1.6 и JDK1.7 по -разному обрабатывают, когда эта строка не существует в постоянном пуле.
Ниже приведен пример проверки и объяснения:
Пример:
public static void main (string [] args) {string str = "str"+new String ("01"); ① str.Intern (); ② string str1 = "str01"; ③ System.out.println (str == str1); String str2 = new String ("str01"); ④ str2.intern (); ⑤ string str3 = "str01"; ⑥ System.out.println (str2 == str3); String str4 = "str01"; ⑦ String str5 = new String ("str")+new String ("01"); ⑧ str5.intern (); ⑨ System.out.println (str4 == str5); В JDK1.6 результат вывода:
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
объяснять:
① Во время выполнения строковый объект STR со значением «str01» будет создан в памяти кучи, а константы «Str» и «01» будут созданы в постоянном пуле;
② При выполнении сначала перейдите в постоянный пул, чтобы проверить, существует ли постоянное значение «str01», и обнаружите, что его не существует. Метод JDK1.6 заключается в создании копии строки «str01» в постоянном пуле;
③ Во время исполнения объект «str01» будет создан в постоянном пуле, и будет обнаружено, что он уже существует, поэтому он не будет создан новым;
Причина первого выхода FALSE заключается в том, что STR указывает на «str01» в памяти кучи, в то время как STR1 указывает на «Str01» в постоянном пуле;
④ При выполнении, в памяти кучи будет создан строковый объект STR2 со значением «str01», а в постоянном пуле будет создана постоянная со значением «str01»;
⑤ При выполнении сначала перейдите в постоянный пул, чтобы проверить, существует ли постоянное значение «str01». Когда будет обнаружено, что он существует, он напрямую вернет эту постоянную ссылку;
⑥ Во время выполнения постоянное значение «str01» будет создано в постоянном пуле. Если обнаружено, что он уже существует, он не будет создан;
Причиной второго выходного ложности является то, что STR2 указывает на «str01» в памяти кучи, в то время как STR3 указывает на «Str01» в постоянном пуле;
⑦ Во время выполнения постоянное значение «str01» будет создано в постоянном пуле;
⑧ При выполнении, строковый объект STR5 со значением «str01» будет создан в памяти кучи, а константы «str» и «01» будут созданы в постоянном пуле;
⑨ При выполнении постоянный пул будет использоваться для проверки, существует ли постоянное значение «str01». Если это найдено, он непосредственно вернет эту постоянную ссылку;
Причиной третьего выходного ложности является то, что STR5 указывает на «Str01» в памяти кучи, в то время как STR4 указывает на «Str01» в постоянном пуле;
В JDK1.7 результат вывода:
истинный
ЛОЖЬ
ЛОЖЬ
объяснять:
Я обнаружил, что только первый результат вывода отличается, поэтому мы объясняем только причину первой:
① Во время выполнения строковый объект STR со значением «str01» будет создан в памяти кучи, а в постоянном пуле будет создана постоянная константа «str» и «01»; (Это ничем не отличается от JDK1.6)
② При выполнении сначала перейдите в постоянный пул, чтобы проверить, существует ли постоянное значение «str01», и обнаружите, что его не существует. Метод JDK1.7 состоит в том, чтобы скопировать ссылку на «str01» в памяти кучи в постоянный пул;
③ Во время исполнения объект «str01» будет создан в постоянном пуле, и будет обнаружено, что он уже существует, поэтому он не будет создан новым;
Затем в это время Str и Str1 будут указывать на значение «str01» в памяти кучи, поэтому они равны;
Выше приведено сравнение метода стажировки класса строки в JDK1.6 и JDK1.7. Есть различия. Друзья, которые это нужно, могут ссылаться на это.