Я не до конца понимаю в чем разница объявления переменной типа String как-нибудь так:
String a = "Hello"
И вот так:
String a = new String("Hello")
Я правильно понимаю, что разница в том, что первый пример - это ссылка и мы не можем вносить изменения в значение строковой переменной, а только по сути создаем новый с новой ссылкой, а во втором случае это именно объект, в значение которого вносится изменение?
Просто методы класса String работают на оба случая и я не до конца понимаю почему.
Буду очень благодарен за ответ!
Алексей
1 уровень
Разница между объектом и переменной String
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
19 февраля 2021, 14:47
Нет, неправильно понимаешь.
String immutable, это значит что объекти типа Стринг нельзя поменять, можно создать новый с изменениями.
Например:
https://developernotes.ru/java/stroki-string-v-java-osobennosti-promlemi-pul-strok-sozdanie-i-rabota-so-strokami
Объект не поменялся.
Просто переменная s содержала ссылку на один объект, а потом получила другую ссылку на другой объект.
Поэтому с точки зрения изменений - между ними нет разницы. Стринг неизменяемый тип, он не меняется, он создается заново.
А разница в том, что при использовании вот такого присвоения:
= " ";
строка попадает в String pool, и новый объект не будет создаваться, ЕСЛИ эта строка уже есть в пуле. В таком случае (объект уже есть в пуле) будет просто возвращена ссылка на существующий объект. Таким образом экономится память.
, а при new String("Hello") будет создан новый объект в любом случае.
Детальнее, почитай
+6
EkaterinaLvova
19 февраля 2021, 14:11
Ни в чем, кроме того, что первая запись короче. Про String чуть позже будет более подробно, на самых начальных уровнях не вдавайтесь пока.
0
Anonymous #2497433
19 февраля 2021, 14:19
но ведь все-таки есть разница. просто зачем изначально даете человеку неверное утверждение?
+1
EkaterinaLvova
19 февраля 2021, 14:27
При написании укороченной записи компилятор за нас понимает как "String a = new String("Hello")". И в итоге какая разница?
-1
Anonymous #2497433
19 февраля 2021, 14:32
так вы сами только что указали разницу
0
Justinian Judge в Mega City One Master
19 февраля 2021, 14:47
нет, он так не понимает. Почитай ссылку которую я приложил выше
0
Сергей Java Developer в Сбер Expert
19 февраля 2021, 15:21
Вот разница.
При записи String hello = "Hello"; создается новый объект в пуле строк (в кэше) если его там нет.
При записи String hello2 = "Hello"; новый объект не создается, а ссылается на уже созданный объект в пуле (кэше).
При записи String a = new String("Hello") всегда создается новый объект
+2
Anonymous #2497433
19 февраля 2021, 15:45
я тоже сначала хотел указать разницу на stringpool
но вопрос на самом деле был не в этом. а создание строк в отдельных случаях, то есть в разных программах, а не в одной
в одной создали так:
а в другой вот так:
0
hidden #2322530
19 февраля 2021, 15:46
ещё один нюанс.
0
Anonymous #2497433
19 февраля 2021, 15:47
отвечаю сам себе:
то есть в двух случаях создается новый объект в stringpool в двух разных программах
*я так понял его вопрос, а там уже автор пусть решает, что он имел в виду
0
hidden #2322530
19 февраля 2021, 15:49
to oneDollarGourmet
то есть в двух случаях создается новый объект в stringpool
нет. во втором случае это просто отдельный объект. и он не относится к String pool вообще никак.
конструктор new String() как правило используется для других целей. для перевода из другого типа в строку.
+1
Anonymous #2497433
19 февраля 2021, 16:01
теперь понял, что имелось в виду под созданием нового объекта. а я думал, что он создается в другом String pool.
теперь я совсем по другому взглянул на эту картинку (хотя помню, что , когда в первый раз увидел эту картинку, я задался вопросом почему она не в новом String pool, но видимо я тогда подумал, что оставлю этот вопрос на потом)
спасибо большое! 👍👍👍
0