Хотя поздно, может быть полезным для кого-то еще прийти через это:
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 объектов экземпляра будет создан. Один в бассейне и другие в куче
Подробное объяснение
Строка первый = "ABC";
Здесь строковый объект с содержимым «abc», созданный в пуле. Переменная экземпляра «first» будет указывать на объект пула с содержимым «abc».
Строка second = new String ("abc");
Здесь в куче будет создан другой строковый объект с контентом «abc». Переменная «second» экземпляра будет указывать на объект кучи с содержимым «abc». Строковый объект с созданием содержимого «abc» в пуле будет пропущен из-за 1-го утверждения. Причина ниже.
Причины
Если предполагаются до утверждения (String первого = «ABC»;) не существует с таким же содержанием, то вообще с «новым» ключевым словом, 2 строковых объекты будут создаваться один в куче (вне пул), а другой в пуле (область подсетей кучи). Также переменная экземпляра «вторая» должна указывать только на объект кучи, независимо от того, находятся ли объекты в пуле или нет.
Теперь из-за наличия предыдущего оператора (String first = "abc";) с тем же содержимым, что и в новой строке ("abc"), только один объект (с содержимым «abc») сохраняется в пуле. Так что из-за 1-го утверждения второй оператор будет иметь только один объект, созданный вместо 2, и этот объект находится в куче. Создание объекта пула будет пропущено.
//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.
@dmindreader: Я не уверен, что вы хотите использовать для этого ... но это напоминает мне то, что я прочитал раньше, и отправил в качестве ответа на другой вопрос SO. Пожалуйста, прочитайте мой ответ на другой вопрос, поскольку он подчеркивает, что использование этих деталей реализации может быть хрупким: http://stackoverflow.com/questions/1111296/when-s-is-false-but-equals-s-is-true/1111405 # 1111405 – Tom
Да, куча и 1. –