Вы получаете строку только в пул констант, если вы вызываете intern
или используете строковый литерал, насколько мне известно.
В любое время, когда вы звоните new String(...)
, вы просто получаете обычный новый объект String
, независимо от того, какой перегрузчик конструктора вы вызываете.
В вашем случае вы также гарантируя, что является строка с содержимым "Stackoverflow"
в постоянном бассейне, тот факт, что вы используете строку буквального вообще - но это не будет добавить еще один, если это уже есть. Таким образом, чтобы разделить его:
String x = "Stackoverflow"; // May or may not introduce a new string to the pool
String y = new String(x); // Just creates a regular object
Кроме того, в результате вызова new String(...)
всегда будет другая ссылка на все предыдущие ссылки - в отличие от использования строкового литерала. Например:
String a = "Stackoverflow";
String b = "Stackoverflow";
String x = new String(a);
String y = new String(a);
System.out.println(a == b); // true due to constant pooling
System.out.println(x == y); // false; different objects
Наконец, точные сроки, когда строка добавляется к постоянная бассейну никогда не были для меня ясно, и не имеют это значение для меня. Я бы предположил, что может быть на загрузке класса (все строковые константы, используемые этим классом, загружаются немедленно), но он может потенциально находиться на основе каждого метода. Можно найти одну конкретную реализацию, используя intern()
, но для меня это никогда не было очень важно :)
Оба. И то и другое. И то и другое. –
'String x =" Stackoverflow "' будет помещен в постоянный пул, 'String x = new String (" Stackoverflow ")' будет помещен в 'heap', а также' String s = new String ("") ' , – Omoro
Вы должны найти подробный ответ здесь: http://stackoverflow.com/questions/14150628/string-constant-pool-java –