Подтвердить что ты не робот

Функция 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 это дает мне ложь. Может ли кто-нибудь сказать мне, почему?

4b9b3361

Ответ 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
}
}