public static String string1 = "Амиго";
public static String string2 = string1;
public static String string3 = new String(string1);
Всем hi. Решил задачу быстро и с первого раза,но мой мозг так и не понял разницу, а именно:
string1 == string2 // ссылки являются одинаковыми
string1 == string3 // ссылки являются разными ___НО ПОЧЕМУ?
string2 == string3 // ссылки являются разными ___НО ПОЧЕМУ?
Глянул гугл и ютуб, и тоже ничего не понял. Думаю, у меня просто не хватает какой-то маленькой детальки в голове. Спасибо тому, кто сможет ее добавить в мой процессор :)
NEZTOVSH0W
6 уровень
Я просто не могу понять. Help/
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Vitaliy Trofimov
21 октября 2021, 13:52
просто нужно помнить что ссылки разные и все
0
ГоффMaster
20 октября 2021, 10:22решение
Попробую объяснить.
В джаве существует пул строк. Когда ты пишешь String string1 = "Амиго";, то джава смотрит, существует ли уже в этом пуле строка "Амиго". Если существует, то в string1 возвращается ссылка на уже существующую. Если не существует - то тогда добавляется в пул и возвращается ссылка на новодобавленную строку.
Когда ты пишешь String string2 = string1;, то в string2 копируется та же ссылка, что и в string1. То-есть это одинаковые ссылки и они равны и указывают на одну и туже строку в пуле. Не на две одинаковые, а на одну и ту же.
Когда ты пишешь String string3 = new String(string1);, то создаётся новый объект типа String, и в него записывается значение, на которое ссылается переменная string1. Пул строк при этом не изменяется и вообще не участвует в этой опреации. И в пуле по ссылке string1 и в новом объекте по ссылке string3 хранятся одинаковые строки. Но хотя они и идентичные, они хранятся в разных местах памяти. Одна в пуле, вторая - в новом объекте. Поэтому ссылки на них разные. Вот и получается, что string1 = string2 (одинаковые ссылки), а string1 != string3, потому что ссылки разные. При этом string1.equals(string3) вернёт true - по значению строки и там, и там одинаковые.
Попробуй вот такую иллюстрацию прогнать:
+4
NEZTOVSH0W
20 октября 2021, 11:01
Благодарю за ответ.
Получается, что через команду "new" всегда создается новый объект с выделенной памятью?
Т.е.
String string3 = new String(string1);
String string4 = new String(string1);
String string5 = new String(string1);
Это все будет новыми ссылками с доп.выделенной памятью?
(могу использовать лексику где-то не верно (учусь)).
0
ГоффMaster
20 октября 2021, 15:46решение
Именно так. Это будут три разных объекта, каждый в своём отдельном участке памяти, все три ссылки будут разные.
+3