|
|
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
1. String s1 = "abc" - на этап компиляции, String s2 = new String("abc"); - во время выполнения. В чем разница и когда она важна, если важна (скорость выполнения программы, еще что-нибудь)? 2. Такой нюанс относится только к строкам или ко всем примитивным типам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2015, 13:19 |
|
||
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
летатель космоса1. String s1 = "abc" - на этап компиляции, String s2 = new String("abc"); - во время выполнения. new String("abc"); не имеет смысл писать в коде, точно так же компилятор работает несколько иначе, обрабатывая строки специальным образом. И что у вас за глагол в этой фразе вместо тире, мне не понятно. летатель космосаВ чем разница и когда она важна, если важна (скорость выполнения программы, еще что-нибудь)? Компилятор находит строковые литералы и помещает их в особый раздел. При исполнении класса такие строки сразу попадают в пул строк. При использовании new String() мы явно создаём новый объект. Это имеет смысл, если мы его создаём из массивов, например. А конструктор new String(String) на практике не применяется. Только для различных тестов и очень особых случаев. летатель космоса2. Такой нюанс относится только к строкам или ко всем примитивным типам? Строка не примитивный тип. Строка это особой тип, который особым образом обрабатывается компилятором. С примитивами у строки общего очень мало. Для примитивов у компилятора и рантайма используются другие механизмы - автобоксинг, пул для определенного диапазона значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2015, 13:53 |
|
||
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
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 - даже если они уже были созданы до этого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2015, 18:36 |
|
||
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
летатель космосаУточниться: если делать 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") - верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2015, 20:11 |
|
||
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
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)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2015, 13:41 |
|
||
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
летатель космосаНо s == "abc" в обоих вариантах будет ложно, ведь это не примитивный тип, а ссылочный. В каких обоих вариантах, очень тяжело угадывать контекст ваших мыслей, когда вы его не указываете. Код: java 1. 2. 3. 4. 5. летатель космосаВ варианте String s = new String("abc"); компилятор делает 2 вещи: помещает "abc" в String Pool и отдельно создает объект "abc" (и кладет ссылку на него в s)? Компилятор компилирует, он не задаёт значения переменных. Компилятор идентифицирует литерал "abc", чтобы в рантайме он попал в пул. Рантайм создаёт новый объект через new String(). В результате в рантайме существуют два объекта, один в пуле, второй созданный через конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2015, 13:47 |
|
||
|
Вопросы по String s1 = "abc"; и String s2 = new String("abc");
|
|||
|---|---|---|---|
|
#18+
Если я правильно помню, то при переходе с одной версии jdk на другую поведение несколько изменилось. Но в общем случае. String состоит из двух сущностей. Массива символов и класса обертки, который указывает на подстроку из этого массива, которая и представляется в виде строки. Компилятор в ряде случаев может понять и не создавать одинаковые сущности. И пользуясь предпосылкой низменности объекта может переиспользовать как обертку, так и массив. Но полагаться на то, что он станет это делать не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 10:48 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=120&tid=2125012]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
22ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 300ms |

| 0 / 0 |
