В чем разница между этими двумя утверждениями?String Primitive/String Класс Разница?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
В чем разница между этими двумя утверждениями?String Primitive/String Класс Разница?
String str = "stackoverflow";
&
String str = new String("stackoverflow");
Он отличается тем, как строка берется из пула.
1. Когда вы говорите,
String str = "stackoverflow"
Это будет первый проверить, если "stackoverflow"
уже существует в Струнный пуле. Если да, то он будет использовать то же самое из пула.
Это является причиной того, почему, когда,
String str1= "stackoverflow";
String str2 ="stackoverflow";
str1==str2? --> will be true
Результат выше будет верно, так как тот же объект Строка из пула используется.
2. Когда вы делаете,
String str = new String("stackoverflow");
Всегда, новый объект Строки создаются, независимо от того же самого уже существует в бассейне или нет.
Так,
String str1= "stackoverflow";
String str2 =new String("stackoverflow");
String str3 =new String("stackoverflow");
Здесь str2 и str3 вновь создать новый объект String.
так, str2, str3 и str1 все они относятся к различным objetcts и str2!=str3!=str1
Хороший анализ/объяснение –
Javadoc для конструктора public String(String arg)
говорит:
инициализацию вновь созданный объект String, так что она представляет собой ту же последовательность символов в качестве аргумента; другими словами, вновь созданная строка является копией строки аргумента. Если явно не нужна явная копия оригинала , использование этого конструктора не нужно, так как строки неизменяемы.
Когда вы String str = "stackoverflow"
Компилятор создает объект String, для вас от буквального.
Когда вы это сделаете: new String("stackoverflow");
два создаются, один - компилятором и один вами.
В Java есть пул для строк. Дополнительная информация: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
+1. ссылка, которую вы разделили, точно объясняет разницу. – verisimilitude
Первая строка выделяет память для строки stackoverflow. Затем он указывает эту переменную на это место.
Вторая строка выделяет пространство для строки. И затем он создает новый класс String. Он копирует строку с первого места на новое место в памяти. Наконец, он указывает переменную на это место.
Все, что вы делаете во втором примере, это создать больше работы для компьютера и использовать больше памяти.
>>> 'до следующей сборки мусора': на самом деле, литерал не получит GCed, а не' str', если вы используете его, когда GC ударяет в –
. О дайте мне исправить это. –
... потому что они (литеры) являются intern() ed –
возможно дубликат [разница между строковым объектом и строками буквальной] (http://stackoverflow.com/questions/3297867/difference-between- string-object-and-string-literal) – EJP