Строковая ссылка? - PullRequest
       1

Строковая ссылка?

3 голосов
/ 16 июня 2011

мы создаем следующие объекты 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), он сравнивает ссылки на строковый объект.Как jvm достигает различий?

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

Ответы [ 2 ]

11 голосов
/ 16 июня 2011

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

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

str1.intern() == str2.intern()
str1.intern() == str3
str2.intern() == str3
str1.intern() == str4
str2.intern() == str4
3 голосов
/ 16 июня 2011

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

str1 = str1.intern();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...