String foo = "bar" против String foo = new String ("bar") в Android? - PullRequest
3 голосов
/ 04 января 2012

Я выполнил поиск по этому вопросу, но ключевые слова должны быть слишком общими, чтобы сузить соответствующие биты. Почему оба способа объявления строки действительны в Android и есть ли разница?

Ответы [ 4 ]

4 голосов
/ 04 января 2012

Используя ключевое слово new, вы создаете новый строковый объект, где использование foo = "bar" будет оптимизировано, чтобы указывать на тот же строковый объект, который используется в другом месте в вашем приложении.

Дляinstacne:

String foo = "bar";
String foo2 = "bar";

компилятор оптимизирует приведенный выше код для того же точного объекта [foo == foo2, в отличие от foo.equals(foo2)].

РЕДАКТИРОВАТЬ: после некоторого поиска @Sulthan был прав.Это не зависит от компилятора, это в спецификациях :

Строковый литерал всегда ссылается на один и тот же экземпляр (§4.3.1) класса String.

3 голосов
/ 04 января 2012

Это синтаксис Java, а не только для Android.Вот обсуждение этого. Строка против новой строки ()

0 голосов
/ 04 января 2012
String x = new String( "x" )

эффективно создает 2 строки. Один для литерала (который является выражением без имени переменной) и тот, который вы сохраняете как x тогда. Это так же, как:

String x;
{
  String a = "x";
  x = new String( a );
}
0 голосов
/ 04 января 2012

Это касается не только Android, но и Java.

Когда вы пишете "xxxx", это буквальная строка.Это строковый экземпляр.Обратите внимание, что все литеральные строки с одинаковым значением являются одним и тем же экземпляром.Подробности см. В методе String.intern().

Пример:


String s1 = "abc";
String s2 = "abc";

, в этом примере s1 == s2 имеет значение true.

new String("xxx") - конструктор копирования.Вы берете одну строку (литерал) и создаете из нее новый экземпляр.Поскольку все строки являются неизменяемыми, это обычно то, что вы не хотите делать.

Пример:


String s1 = "abc";
String s2 = new String("abc");

s1.equals(s2) верно
s1 == s2 неверно

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