Вопрос-ответ

Difference between string object and string literal [duplicate]

Разница между строковым объектом и строковым литералом

В чем разница между

String str = new String("abc");

и

String str = "abc";
Переведено автоматически
Ответ 1

При использовании строкового литерала строка может быть интернирована, но при использовании new String("...") вы получаете новый строковый объект.

В этом примере оба строковых литерала ссылаются на один и тот же объект:

String a = "abc"; 
String b = "abc";
System.out.println(a == b); // true

Здесь создаются 2 разных объекта, и у них разные ссылки:

String c = new String("abc");
String d = new String("abc");
System.out.println(c == d); // false

В общем, вам следует использовать строковую литеральную нотацию, когда это возможно. Ее легче читать, и это дает компилятору возможность оптимизировать ваш код.

Ответ 2

Строковый литерал - это концепция языка Java. Это строковый литерал:

"a String literal"

Строковый объект является отдельным экземпляром java.lang.String класса.

String s1 = "abcde";
String s2 = new String("abcde");
String s3 = "abcde";

Все допустимы, но имеют небольшое различие. s1 будет ссылаться на интернированный строковый объект. Это означает, что последовательность символов "abcde" будет храниться в центральном месте, и всякий раз, когда тот же литерал "abcde" используется снова, JVM не будет создавать новый строковый объект, а будет использовать ссылку на кэшированную строку.

s2 гарантируется, что это будет новый строковый объект, поэтому в данном случае мы имеем:

s1 == s2 // is false
s1 == s3 // is true
s1.equals(s2) // is true
Ответ 3

Длинный ответ доступен здесь, поэтому я дам вам короткий.

Когда вы делаете это:

String str = "abc";

Вы вызываете intern() метод для строки. Этот метод ссылается на внутренний пул String объектов. Если строка, для которой вы вызвали intern(), уже находится в пуле, то ссылка на нее String присваивается str. Если нет, то новый объект String помещается в пул, и затем ему присваивается ссылка на str.

Дан следующий код:

String str = "abc";
String str2 = "abc";
boolean identity = str == str2;

Когда вы проверяете идентичность объекта, выполняя == (вы буквально спрашиваете: указывают ли эти две ссылки на один и тот же объект?), вы получаете true.

Однако вам это не нужно intern() Strings. Вы можете принудительно создать новый Object объект в куче, выполнив следующее:

String str = new String("abc");
String str2 = new String("abc");
boolean identity = str == str2;

В данном случае str и str2 являются ссылками на разные Objects, ни одна из которых не была интернирована, так что при проверке на Object идентичность с помощью ==, вы получите false.

С точки зрения надлежащей практики кодирования: не используйте == для проверки равенства строк, используйте .equals() вместо этого.

Ответ 4

Поскольку строки неизменяемы, когда вы делаете:

String a = "xyz"

при создании строки JVM выполняет поиск в пуле строк, существует ли уже строковое значение, "xyz" если да, то 'a' это будет просто ссылка на эту строку, и новый строковый объект не создается.

Но если вы скажете:

String a = new String("xyz")

вы заставляете JVM создавать новую String ссылку, даже если "xyz" она находится в ее пуле.

Для получения дополнительной информации прочтите это.

java string