2012-05-23 3 views
1

В чем разница между этими двумя утверждениями?String Primitive/String Класс Разница?

String str = "stackoverflow"; 

&

String str = new String("stackoverflow"); 
+0

возможно дубликат [разница между строковым объектом и строками буквальной] (http://stackoverflow.com/questions/3297867/difference-between- string-object-and-string-literal) – EJP

ответ

4

Он отличается тем, как строка берется из пула.

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

+0

Хороший анализ/объяснение –

2

Javadoc для конструктора public String(String arg) говорит:

инициализацию вновь созданный объект String, так что она представляет собой ту же последовательность символов в качестве аргумента; другими словами, вновь созданная строка является копией строки аргумента. Если явно не нужна явная копия оригинала , использование этого конструктора не нужно, так как строки неизменяемы.

Когда вы String str = "stackoverflow" Компилятор создает объект String, для вас от буквального.

Когда вы это сделаете: new String("stackoverflow"); два создаются, один - компилятором и один вами.

2

Первая строка выделяет память для строки stackoverflow. Затем он указывает эту переменную на это место.

Вторая строка выделяет пространство для строки. И затем он создает новый класс String. Он копирует строку с первого места на новое место в памяти. Наконец, он указывает переменную на это место.

Все, что вы делаете во втором примере, это создать больше работы для компьютера и использовать больше памяти.

+0

>>> 'до следующей сборки мусора': на самом деле, литерал не получит GCed, а не' str', если вы используете его, когда GC ударяет в –

+0

. О дайте мне исправить это. –

+1

... потому что они (литеры) являются intern() ed –

Смежные вопросы