2011-06-16 3 views
3

мы делаем следующие объекты String?Ссылка на строку?

String str1 = new String("ABC"); 
String str2 = new String("ABC"); 
String str3 = "ABC"; 
String str4 = "ABC"; 

Два вопроса по выше:

  1. system.out.println("valof str1 "+str1); - это печатает str1, как ABC Но когда мы сравниваем if(str1==str2), он сравнивает refrences струнной объекта. Как делает jvm получить differnce?

  2. str1 имеет различную ссылку из str2 и str3 но str3 и str4 имеют одинаковые ссылки, так же JVM проверить, если строка, которую мы будем создавать с использованием соответствующим оператором (вместо нового) уже существует (если он существует, то он не создает новый объект просто присваивает тот же refernce новой переменной, то есть str4), но он не делает эту вердикцию в случае нового оператора?

ответ

11

В Java строковые литералы (голый "ABC" вместо new String("ABC")) являются интернированы. То есть в JVM хранится только одна копия, и это всегда используется копия. Вот почему они сравнивают одинаковые при использовании ==.

следующие сравнения также всегда верно:

str1.intern() == str2.intern() 
str1.intern() == str3 
str2.intern() == str3 
str1.intern() == str4 
str2.intern() == str4 
+0

FYI вы можете вызвать s.intern(), чтобы ставить любую строку. –

+0

@Spike: Действительно, я обновил свой ответ, чтобы продемонстрировать это. (Я все же планировал поставить это в самом начале, но так как я хотел получить первое сообщение в «Самый быстрый пистолет на Западе» --- я обычно отправляю что-то основное, а затем расширяю его в пределах 5-минутной грации период.) –

+0

Спасибо, Крис за то, что дал проницательное объяснение. Но у меня ниже запросов на ваше объяснение: - 1) если мы создали str1 = new String («ABC») // он не добавлен в пул до сих пор .correct? но когда мы делаем str1.intern(), он добавляет str1 в пул. Моя точка 1 остается без ответа. Если мы выполняем if (str1 == str2), она сравнивает ссылку, но при печати str1 внутри sys out она фактически печатает значение? –

3

Вы явно создавать новые строки и просят различных ссылок при вызове new String(...). Если вы хотите вернуться к одной ссылке, вы можете позвонить:

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