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