Вопросы о пуле строк Java



рассмотрим этот код:



String first = "abc"; 
String second = new String("abc");


при использовании new ключевое слово, Java создаст abcString опять да?
Будет ли это храниться в обычной куче или String бассейн?
Сколько String s закончится в String бассейн?

617   7  

7 ответов:

если вы используете new сайта, Новый String объект будет создан. Обратите внимание, что объекты всегда находятся в куче - пул строк не является отдельной областью памяти, которая отделена от кучи.

пул строк похож на кэш. Если вы сделаете это:

String s = "abc";
String p = "abc";

тогда компилятор Java достаточно умен, чтобы сделать только один

на код, первое задание:

  Code:
   0:   ldc     #2; //String abc
   2:   astore_1

тогда как второй:

   3:   new     #3; //class java/lang/String
   6:   dup
   7:   ldc     #2; //String abc
   9:   invokespecial   #4; //Method java/lang/String."":(Ljava/lang/String;)V

таким образом, первый находится в пуле (в позиции #2), тогда как второй будет храниться в куче.

EDIT

С CONSTANT_String_infoхранить индекс как U2 (16 бит, без знака) пул может содержать не более 2**16= 65535 ссылки. В случае, если вы заботитесь здесь больше пределов JVM.

каждый раз, когда ваш код создает Строковой литерал

например:

String str="Hello"; (string literal) 

JVM сначала проверяет пул строковых литералов. Если строка уже существует в пуле, возвращается ссылка на экземпляр пула. Если строка не существует в пуле, создается новый объект String, а затем помещается в пул. Java может сделать эту оптимизацию, так как строки являются неизменными и могут быть разделены, не опасаясь повреждения данных

String strObject = new String("Java");

и

String strLiteral = "Java";

оба выражения дают вам строковый объект, но между ними есть тонкая разница. При создании объекта String с помощью оператора new () он всегда создает новый объект в памяти кучи. С другой стороны, если вы создаете объект с использованием синтаксиса строкового литерала, например "Java", он может возвращать существующий объект из пула строк (кэш строкового объекта в Perm gen space, который теперь перемещен в пространство кучи в недавнем выпуске Java), если он уже существует.

единственный раз, когда вы должны использовать новую строку (foo), это когда вы хотите разбить==, что является нечетным случаем, или когда foo является подстрокой гораздо большей строки, которая имеет ограниченное время жизни, например

String mystring;
{
   String source = getSomeHeinouslyLargeString();
   mystring = new String(source.substring(1,3));
}

хотя и поздно, может быть полезно для кого-то еще наткнуться на это:

String first = "abc";
//One instance object in pool created. Instance variable “first” refers/points to pooled object

String second = new String("abc");    
//One instance object in heap created. Object in pool creation step will be skipped on account of first statement.

таким образом, в общей сложности будет создано 2 объекта экземпляра. Один в пуле, а другой в куче

Подробное Объяснение

String first = "abc";

здесь строковый объект с содержимым "abc", созданный в пуле. Переменная экземпляра " first "будет указывать на объект пула с содержимым"abc".

строка вторая = новый Строка ("abc");

здесь другой строковый объект с содержимым "abc"будет создан в куче. Переменная экземпляра " second "будет указывать на объект кучи с содержимым"abc". Строковый объект с созданием контента " abc " в пуле будет пропущен из-за 1-го оператора. Причина ниже.

причины

если предполагаемый предыдущий оператор (String first = "abc";) не существует с тем же содержимым, то, как правило, с ключевым словом "new", 2 строковых объекта будут создайте один в куче(внешний пул), а другой в пуле (область подмножества кучи). Также переменная экземпляра "second" должна указывать только на объект кучи, независимо от того, находятся ли объекты в пуле или нет.

//Additional Test on the concept
System.out.println(first==second);  //returns false. Because first points to pool object while second points to heap object. And both objects are different (on account of different memory locations).

second = second.intern();           //After interning, second now points to pool object. Note: intern is used so that reference variable points to pool area object and not heap object. Clearly it is applicable when we use new keyword.

System.out.println(first==second);  //returns true. Because now both first and second objects now points to same pool object.
String first = "abc"; 
String second = new String("abc");

в первом случае в пуле будет создан только один объект. Во втором случае два объекта создадут один в пуле (если он ранее не существовал в пуле) и один в куче.

при передаче любого значения с двойной кавычкой ex: "abc" вы создаете объект в пуле и передаете его в строковый конструктор для создания нового объекта с тем же значением в куче.

Если вы видели строковый конструктор, вы можете увидеть, что он принимает строку. Что это струна? Перед созданием что это за строковый объект. Это не что иное, как объект, хранящийся в пуле строковых констант.

Comments

    Ничего не найдено.