Строки являются объектами в Java, итак, почему мы не используем 'новый' для создания их?

Мы обычно создаем объекты с помощью new ключевое слово, как:

Object obj = new Object();

Строки являются объектами, все же мы не используем new создать их:

String str = "Hello World";

Почему это? Я могу сделать Строку с new?

101
задан Michael Myers 7 January 2010 в 17:50
поделиться

9 ответов

[

] В дополнение к тому, что уже было сказано, строковые [] литералы [] [т.е. такие строки как [] "abcd" [], но не такие как [] новая строка ("abcd") []] в Java интернированы - это означает, что каждый раз, когда вы ссылаетесь на "abcd", вы получаете ссылку на один единственный [] экземпляр строки [], а не на новый каждый раз. Так что у вас будет:[

] [
String a = "abcd";
String b = "abcd";

a == b; //True
] [

]но если у вас был[

] [
String a = new String("abcd");
String b = new String("abcd");
] [

]то можно иметь[

] [
a == b; // False
] [

](а если кому-то нужно напомнить, то всегда используйте [].equals()[] для сравнения строк; []==[] тесты на физическое равенство).[

] [

]Внутренние строковые литералы хороши тем, что их часто используют более одного раза. Например, рассмотрим (надуманный) код:[

] [
for (int i = 0; i < 10; i++) {
  System.out.println("Next iteration");
}
] [

]Если бы не было переплетения строк, то "Следующую итерацию" нужно было бы инстанцировать 10 раз, тогда как теперь она будет инстанциироваться только один раз.[

].
126
ответ дан 24 November 2019 в 04:41
поделиться

Практически нет необходимости вводить новую строку, так как литерал (символы в кавычках) уже является объектом String, созданным при загрузке класса хоста. Вызов методов на литерале и don абсолютно легален, главное отличие - удобство, обеспечиваемое литералами. Было бы большой болью и пустой тратой времени, если бы нам пришлось создавать массив символов char и заполнять его char, а они делать новый String(char-массив).

.
0
ответ дан 24 November 2019 в 04:41
поделиться

В Java, Строки - это особый случай, со многими правилами, которые применяются только к Строкам. Двойные кавычки заставляют компилятор создать объект String. Так как объекты String являются неизменяемыми, это позволяет компилятору встраивать несколько строк и строки из них строкового пула большего размера. Две идентичные Строковые константы всегда будут иметь одну и ту же ссылку на объект. Если вы не хотите, чтобы так было, то можете использовать новую String(""), и это создаст объект String во время выполнения. Раньше метод Intern() был обычным, чтобы вызвать проверку динамически создаваемых строк по таблице поиска строк. После того, как строка вставлена, ссылка на объект будет указывать на канонический экземпляр Строки.

    String a = "foo";
    String b = "foo";
    System.out.println(a == b); // true
    String c = new String(a);
    System.out.println(a == c); // false
    c = c.intern();
    System.out.println(a == c); // true

Когда загрузчик классов загружает класс, все строковые константы добавляются в пул строк.

.
2
ответ дан 24 November 2019 в 04:41
поделиться
[

]Не стесняйтесь создавать новую строку с [

] [
String s = new String("I'm a new String");
] [

]Обычная нотация []s = "новая строка"; [] более или менее удобный ярлык - который следует использовать в целях выполнения, за исключением тех довольно редких случаев, когда вам []действительно[] нужны строки, которые соответствуют уравнению [

] [
(string1.equals(string2)) && !(string1 == string2)
] [

][]EDIT[][

] [

]В ответ на комментарий: это было []не[] предназначено для того, чтобы быть советом, а просто прямым ответом на тезис о том, что [] мы не используем 'новое' ключевое слово[] для Strings, что просто не соответствует действительности. Надеюсь, что эта редакция (в том числе и выше) немного прояснит это. BTW - есть пара хороших и гораздо лучших ответов на вышеприведенный вопрос по SO.[

].
0
ответ дан 24 November 2019 в 04:41
поделиться
[

] Синтаксический сахар. Синтаксис [

] [
String s = new String("ABC");
] [

] все еще доступен.[

]
0
ответ дан 24 November 2019 в 04:41
поделиться
[

] Вы все еще можете использовать []new String("строка")[], но было бы сложнее создавать новые строки без строковых литералов ... вам пришлось бы использовать символьные массивы или байты :-) Строковые литералы имеют одно дополнительное свойство: все те же самые строковые литералы от любой точки класса до одного и того же экземпляра строки (они интернированы).[

]
0
ответ дан 24 November 2019 в 04:41
поделиться
[

] Строка подвергается нескольким оптимизациям (за неимением лучшей фразы). Обратите внимание, что в строке также присутствует перегрузка оператора (для оператора +) - в отличие от других объектов. Так что это особый случай.[

].
6
ответ дан 24 November 2019 в 04:41
поделиться
[

]Это ярлык. Изначально все было не так, но Java изменила его.[

] [

]Этот []FAQ[] говорит об этом вкратце. Руководство по спецификации Java также говорит об этом. Но я не могу найти его в интернете.[

]
6
ответ дан 24 November 2019 в 04:41
поделиться
[

] Строки - это "специальные" объекты на Java. Дизайнеры Java мудро решили, что строки используются так часто, что им нужен не только собственный синтаксис, но и стратегия кэширования. Когда вы объявляете строку, говоря:[

] [
String myString = "something";
] [

]myString - это ссылка на объект String со значением "что-то". Если вы позже объявите:[

] [
String myOtherString = "something";
] [

]Java достаточно умна, чтобы понять, что myString и myOtherString одинаковы и будут хранить их в глобальной таблице String как один и тот же объект. Это зависит от того, что вы не можете модифицировать Strings для этого. Это уменьшает требуемый объем памяти и может сделать сравнения более быстрыми.[

] [

]Если вместо этого вы напишете[

] [
String myOtherString = new String("something");
] [

]Java создаст для вас совершенно новый объект, отличный от объекта myString.[

].
31
ответ дан 24 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: