Когда мы должны использовать метод интерна String для литералов String - PullRequest
178 голосов
/ 06 декабря 2009

Согласно String # intern () , метод intern должен возвращать строку из пула строк, если строка найдена в пуле строк, в противном случае новый объект строки будет добавлен в строку pool и ссылка на эту строку возвращается.

Итак, я попробовал это:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

Я ожидал, что s1 and s3 are same будет напечатано, поскольку s3 интернирован, а s1 and s2 are same не будет напечатано. Но результат: обе строки напечатаны. Это означает, что по умолчанию строковые константы интернированы. Но если это так, то зачем нам метод intern? Другими словами, когда мы должны использовать этот метод?

Ответы [ 13 ]

2 голосов
/ 22 августа 2013

Interned Strings избегают дублирования строк. Interning экономит оперативную память за счет увеличения процессорного времени для обнаружения и замены дублирующихся строк. Существует только одна копия каждой строки, которая была интернирована, независимо от того, сколько ссылок на нее указывают. Поскольку строки являются неизменяемыми, если два разных метода случайно используют одну и ту же строку, они могут совместно использовать копию одной строки. Процесс преобразования дублированных строк в разделяемые называется interning.String.intern () дает вам адрес канонической главной строки. Вы можете сравнить интернированные строки с простым == (который сравнивает указатели) вместо равно , которое сравнивает символы строки по одному. Поскольку строки являются неизменяемыми, внутренний процесс может дополнительно экономить место, например, не создавая отдельный литерал String для «pot», если он существует в качестве подстроки какого-либо другого литерала, такого как «hippopotamus».

Чтобы увидеть больше http://mindprod.com/jgloss/interned.html

1 голос
/ 20 апреля 2015

Как вы сказали, метод string intern() сначала найдет из пула String, если найдет, то вернет объект, который указывает на это, или добавит новую строку в пул.

    String s1 = "Hello";
    String s2 = "Hello";
    String s3 = "Hello".intern();
    String s4 = new String("Hello");

    System.out.println(s1 == s2);//true
    System.out.println(s1 == s3);//true
    System.out.println(s1 == s4.intern());//true

s1 и s2 - это два объекта, указывающие на пул строк "Hello", и с помощью "Hello".intern() будет найдено, что s1 и s2. Так что "s1 == s3" возвращает true, а также s3.intern().

1 голос
/ 31 марта 2015

метод string intern () используется для создания точной копии объекта строки кучи в пуле строковых констант. Строковые объекты в пуле строковых констант автоматически интернируются, а строковые объекты в куче - нет. Основное использование создания интернов - это экономия места в памяти и более быстрое сравнение строковых объектов.

Источник: Что такое строка intern в java?

...