Функция Java Intern
Я немного запутался в функции intern. У меня есть следующий код:
public class InternTest{
public static void main(String args[]){
String s1 = "ANEK";
String s2 = new String("ANEK");
String s3 = s2.intern();
System.out.println(s3 == s1); // True
String s11 = "ANEK".concat("SINGH");
String s22 = s11.intern();
System.out.println(s11 == s22); // True
String s4 = "nat".concat("ive");
String s5 = s4.intern();
System.out.println(s4 == s5); // True
String s33 = "ma".concat("in");
String s44 = s33.intern();
System.out.println(s33 == s44); // false
String s331 = "ja".concat("va");
String s441 = s331.intern();
System.out.println(s331 == s441); // false
}
}
Мой вопрос касается вывода. В третьем случае это дает мне правду, но в четвертом и пятом случае это дает мне ложь. Могу ли я узнать, что является причиной этих результатов? Я не мог прийти к выводу, что он дает ложное значение для зарезервированного слова java или ключевого слова, потому что, когда я пытался с энтум, он дает истину, но с помощью te это дает мне ложь. Может ли кто-нибудь сказать мне, почему?
Ответы
Ответ 1
Ну, вы получите результат, который вы делаете, потому что строки java
и main
уже находятся в пуле - при запуске приложения загружено много других классов, а некоторые из них уже интернированы эти строки (до того, как ваш код будет достигнут)
Я ожидал бы и native
, но, я думаю, нет, это означает, что никто другой не ставит его.
Это заметило некоторое внимание (чего я и не ожидал), поэтому я подумал, что немного расширю его. Предположим, вы это сделали:
String left = new String(new char[] { 'h', 'e', 'y' });
String right = left.intern();
System.out.println(left == right);
Это напечатает true
, потому что "эй" не был в пуле строк до и был добавлен нашим left.intern()
. С другой стороны:
String left = new String(new char[] { 'j', 'a', 'v', 'a' });
String right = left.intern();
System.out.println(left == right);
печатает false
, потому что "java" уже находится в пуле, когда мы вызывали left.intern
.
Ответ 2
Посмотрите документацию intern()
:
если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.
Это означает, что если уже есть строка с заданным значением в пуле , который возвращает старую строку, в противном случае возвращается фактическая строка.
Так как первые три строки не находятся в пуле, фактические строки - s2
, s11
и s4
возвращаются после добавления в пул, поэтому это одна и та же ссылка. Как-то '' main '' и '' java '' уже находятся в пуле, а intern()
возвращает эту строку вместо s33
или s331
(предполагая s331.intern()
для последнего вызова).
Попробуйте следующее:
String tmp = "ANEKSINGH"; // so this is in the pool
String s11 = "ANEK".concat("SINGH");
String s22 = s11.intern();
System.out.println(s11 == s22); // FALSE now
Ответ 3
intern() Возвращает каноническое представление для строкового объекта. пул строк, изначально пустой, поддерживается частным классом Строка.
При вызове метода intern, если пул уже содержит строка, равная этому объекту String, определяемая равными (Object) метод, то возвращается строка из пула. В противном случае это Объект String добавляется в пул и ссылка на эту строку объект возвращается.
Результат, возвращающий true, означает, что строка присутствует в пуле строк.
Вывод будет правдой, если вы ставите только что созданную и конкретизированную строку, используя intern()
Пример:
public class InternTest{
public static void main(String args[]){
String s1 = "ANEK";
String s2 = (new String("ANEK")).intern();
String s3 = s2.intern();
System.out.println(s3 == s1); // True
String s33 = ("ma".concat("in")).intern();
String s44 = s33.intern();
System.out.println(s33 == s44); // True
String s331 = ("ja".concat("va")).intern();
String s441 = s33.intern();
System.out.println(s331 == s441); // True
}
}