powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопросы по String s1 = "abc"; и String s2 = new String("abc");
7 сообщений из 7, страница 1 из 1
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39032291
1. String s1 = "abc" - на этап компиляции, String s2 = new String("abc"); - во время выполнения. В чем разница и когда она важна, если важна (скорость выполнения программы, еще что-нибудь)?

2. Такой нюанс относится только к строкам или ко всем примитивным типам?
...
Рейтинг: 0 / 0
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39032329
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
летатель космоса1. String s1 = "abc" - на этап компиляции, String s2 = new String("abc"); - во время выполнения.
new String("abc"); не имеет смысл писать в коде, точно так же компилятор работает несколько иначе, обрабатывая строки специальным образом. И что у вас за глагол в этой фразе вместо тире, мне не понятно.

летатель космосаВ чем разница и когда она важна, если важна (скорость выполнения программы, еще что-нибудь)?
Компилятор находит строковые литералы и помещает их в особый раздел. При исполнении класса такие строки сразу попадают в пул строк. При использовании new String() мы явно создаём новый объект. Это имеет смысл, если мы его создаём из массивов, например.
А конструктор new String(String) на практике не применяется. Только для различных тестов и очень особых случаев.


летатель космоса2. Такой нюанс относится только к строкам или ко всем примитивным типам?
Строка не примитивный тип.
Строка это особой тип, который особым образом обрабатывается компилятором.
С примитивами у строки общего очень мало. Для примитивов у компилятора и рантайма используются другие механизмы - автобоксинг, пул для определенного диапазона значений.
...
Рейтинг: 0 / 0
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39032705
Blazkowicznew String("abc"); не имеет смысл писать в коде, точно так же компилятор работает несколько иначе, обрабатывая строки специальным образом. И что у вас за глагол в этой фразе вместо тире, мне не понятно.
Опечатался.

BlazkowiczКомпилятор находит строковые литералы и помещает их в особый раздел. При исполнении класса такие строки сразу попадают в пул строк. При использовании new String() мы явно создаём новый объект. Это имеет смысл, если мы его создаём из массивов, например.
А конструктор new String(String) на практике не применяется. Только для различных тестов и очень особых случаев.
Нашел на хабре статью по строкам ( http://habrahabr.ru/post/260767/). Один из комментариев - как раз то, что вы сказали:

"Хотелось бы дополнить и сказать, что все ссылки на string объекты хранится в String Pool и перед созданием строки с помощью литерала проверяется нет ли эквивалентной строки в пуле, если нет — добавляется, иначе просто получаем ссылку на уже готовый объект. В случаи с new, новый объект создаться в любом случаи, независимо от пула."

Уточниться: если делать new String("abc"); new String(CharArray); то в String Pool создаются объекты "abc", CharArray - даже если они уже были созданы до этого?
...
Рейтинг: 0 / 0
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39032739
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
летатель космосаУточниться: если делать new String("abc"); new String(CharArray); то в String Pool создаются объекты "abc", CharArray - даже если они уже были созданы до этого?
Нет. Вы вообще всё напутали.
Если написать
String s = "abc";
то строка "abc" попадает в пул.
Если написать
String s = new String("abc");
То "abc" попадает в пул, но переменная s указывает на другой объект, который не в пуле.
Как результат выражение s == "abc" ложно. При том что s.equals("abc") - верно.
...
Рейтинг: 0 / 0
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39033136
BlazkowiczЕсли написать
String s = "abc";
то строка "abc" попадает в пул.
Если написать
String s = new String("abc");
То "abc" попадает в пул, но переменная s указывает на другой объект, который не в пуле.
Как результат выражение s == "abc" ложно. При том что s.equals("abc") - верно.
Но s == "abc" в обоих вариантах будет ложно, ведь это не примитивный тип, а ссылочный.

В варианте String s = new String("abc"); компилятор делает 2 вещи: помещает "abc" в String Pool и отдельно создает объект "abc" (и кладет ссылку на него в s)?
...
Рейтинг: 0 / 0
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39033138
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
летатель космосаНо s == "abc" в обоих вариантах будет ложно, ведь это не примитивный тип, а ссылочный.

В каких обоих вариантах, очень тяжело угадывать контекст ваших мыслей, когда вы его не указываете.

Код: java
1.
2.
3.
4.
5.
String s1 = "abc";
String s2 = "abc";
if(s1 == s2){
   Systm.out.println(s1 == s2);
}




летатель космосаВ варианте String s = new String("abc"); компилятор делает 2 вещи: помещает "abc" в String Pool и отдельно создает объект "abc" (и кладет ссылку на него в s)?
Компилятор компилирует, он не задаёт значения переменных.
Компилятор идентифицирует литерал "abc", чтобы в рантайме он попал в пул.
Рантайм создаёт новый объект через new String(). В результате в рантайме существуют два объекта, один в пуле, второй созданный через конструктор.
...
Рейтинг: 0 / 0
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
    #39035372
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно помню, то при переходе с одной версии jdk на другую поведение несколько изменилось.
Но в общем случае. String состоит из двух сущностей. Массива символов и класса обертки, который указывает на подстроку из этого массива, которая и представляется в виде строки.

Компилятор в ряде случаев может понять и не создавать одинаковые сущности. И пользуясь предпосылкой низменности объекта может переиспользовать как обертку, так и массив.

Но полагаться на то, что он станет это делать не стоит.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопросы по String s1 = "abc"; и String s2 = new String("abc");
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]