понимание разницы между java.lang.String s = new String (hello) и String hold = hello

Я наткнулся на этот код и немного запутался

java.lang.String s = new String("hello");

Я не уверен, какая переменная инициализируется как java.lang.String, и какова цель этого vs String hold = "hello". Я попытался просмотреть документацию, но ничего не нашел.


person user2980837    schedule 12.11.2013    source источник
comment
Когда вы вызываете new, вы создаете строку нового объекта, поэтому вы создаете копию строкового литерала.   -  person Peter Lawrey    schedule 13.11.2013


Ответы (5)


Это действительно плохой стиль программирования

java.lang.String s = new String("hello");

Помните, что все классы в java.lang импортируются автоматически. Если у вас есть класс с именем String в том же пакете, он также будет импортирован, но затеняет класс java.lang.String. Это может быть причиной полностью квалифицировать такой тип, как

java.lang.String s;

Но в этом случае вы могли бы присвоить ему только java.lang.String ссылку, поскольку этот класс final и, следовательно, не может быть расширен. Обычным делом было бы

java.lang.String s = new java.lang.String("hello");

Если бы вы спрашивали о

java.lang.String s = new String("hello");

vs

java.lang.String s = "hello";

затем проверьте другие ответы или дубликат.

person Sotirios Delimanolis    schedule 12.11.2013

Делая это:

String s = "hello";

лучше, чем делать это:

String s = new String("hello");

Второй метод создает строковый объект, когда вы выполняете "hello", передает его конструктору String, а затем создает другой идентичный объект String. Первый метод создает только один объект.

person gla3dr    schedule 12.11.2013
comment
2 объекта? это немного сбивает с толку ... вы можете объяснить - person user2980837; 12.11.2013
comment
Литерал создает первую строку приветствия, затем конструктор String копирует эту строку (строки Java неизменяемы), а оригинал отбрасывается. Есть шанс, что все это можно будет оптимизировать, но это все еще довольно плохой стиль. - person DennisK; 12.11.2013
comment
@ user2980837 Конструктор String public String(String original) называется copy конструктором, потому что он создает копию переданной ему строки. См. Ссылку, которую dkatzel разместил в комментарии к вашему исходному вопросу. - person gla3dr; 12.11.2013

Хорошо, вам нужно знать о пуле констант (пул строковых литералов)

Когда ты делаешь

String s = "hello";

вы фактически настраиваете переменную в постоянном пуле

где как когда ты это делаешь

String s = new String("hello");

он создает отдельный объект в постоянном пуле.

Об этом подробнее здесь

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

person Acewin    schedule 12.11.2013
comment
Обратите внимание, что "hello" по-прежнему будет помещен в постоянный пул независимо от того, что вы это делаете. - person Sotirios Delimanolis; 12.11.2013
comment
правда, обновил свой ответ - person Acewin; 13.11.2013

Первое, на что вы должны обратить внимание, - это неизменяемая функция String в java. http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html.

String hold = "hello" использует неизменяемую природу строки. Итак, когда вы это сделаете,

    String hold2 = "hello"

как hold, так и hold2 относятся к одному и тому же экземпляру строки «hello» из пула строк. Это означает, что оба относятся к одному и тому же месту в памяти. Но с

   String hold2 = new String("hello");

есть новая строка «hello» в новом месте, а объекты hold и hold2 относятся к разным ячейкам памяти.

person shallOvercome    schedule 12.11.2013

Первое, что вам следует знать, это то, что строки в java являются неизменяемыми, прочтите ЭТО. Затем, когда вы делаете String s = "hello" за кулисами, происходит то, что компилятор просматривает String Pool (место, где строки сохраняются в java) и проверяет, есть ли там уже строка hello. Если это так, он указывает ссылку s на тот же строковый объект и возвращает (Прочтите ЭТО). Теперь, если вы сделаете String hold2 = new String("hello");, ничего из вышеперечисленного не произойдет. Даже если у вас есть hello строка в String Pool, она все равно создаст новую строку hello и укажет на нее ссылку hold2.

person Prateek    schedule 12.11.2013