Задачу я уже решил, но с 7 попытки. Причина была в том, что программа выдавала ошибку если копировать массив командой "int[] arr = array", а после сортировал дубликат. Вопрос лишь в том, почему такую команду валидатор не принимает, а через метод copyOf() принимает?
BlackStar_Marusa
21 уровень
Вопрос про копирование массива.
Обсуждается
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
VladimirMaster
30 июня 2023, 03:48
Вопрос лишь в том, почему такую команду валидатор не принимает, а через метод copyOf() принимает?
Когда ты используешь оператор присваивания, как в твоем примере , ты фактически копируешь ссылку на существующий массив, а не сам массив. Это означает, что оба массива будут ссылаться на одни и те же данные. Если ты внесешь изменения в один из массивов, изменения будут видны и в другом массиве.
В случае использования метода , ты создаешь новый массив, который содержит копию элементов исходного массива. Это дает тебе полностью независимый массив, и изменения, внесенные в один массив, не будут влиять на другой массив.
+1
ГоффMaster
30 июня 2023, 08:22
Уточню вот это: "Это означает, что оба массива будут ссылаться на одни и те же данные. Если ты внесешь изменения в один из массивов, изменения будут видны и в другом массиве."
Нет здесь никакого другого второго массива, синхронизированного с первым. Есть один единственный. Это важное для понимания уточнение.
0
VladimirMaster
30 июня 2023, 13:54
ты фактически копируешь ссылку на существующий массив, а не сам массив. Это означает, что оба массива будут ссылаться на одни и те же данные
Если ты не заметил, но я так и сказал, что "ты фактически копируешь ссылку на существующий массив, а не сам массив".
И если абстрагироваться, то "Это означает, что оба массива будут ссылаться на одни и те же данные. Если ты внесешь изменения в один из массивов, изменения будут видны и в другом массиве."
Умение абстрагироваться - это важное для понимания уточнение. :)
0
ГоффMaster
28 июня 2023, 23:30полезный
Массив - это объект, переменные объекта, они ссылочного типа. Если просто - в переменных ссылочного типа хранится не сам объект (в этом случае массив), а адрес этого объекта в памяти.
Вот у нас есть квартира - это объект. А в переменную мы записываем не квартиру, а адрес квартиры, потому что квартиру в переменную записать нельзя. Комнаты, метраж, балкон, южный склон, ну как это всё в одну переменную уместить? Поэтому просто адрес. Нужно будет в квартиру зайти - идём по адресу (ссылке в переменной).
Когда ты int[] arr = array, то ты создаёшь новую ссылочную переменную типа int[] с названием arr, и копируешь в неё ссылку из переменной array. То-есть массив остаётся один, просто теперь не одна, а две переменные ссылаются на него, единственного. Ну, типа, вот в твоём паспорте указан адрес и в паспорте жены указан тот же адрес. Если жена в своей квартире переставит мебель, то и в твоей квартире она окажется переставленной (упс, нежданчик ;-) ). Потому что это та же квартира, хотя паспорта (переменные с адресом) у вас и разные.
Метод copy создаёт второй массив (вторую квартиру с другим адресом). В этом разница.
+2
BlackStar_Marusa
28 июня 2023, 23:45
Получается в первом случае при изменении массива-клона меняется и сам оригинал, так как я задал ему тот же адрес, что и у оригинала?
0
ГоффMaster
28 июня 2023, 23:55
Но вообще тема копирования объектов стоит того, что бы с ней разобраться, может, не сейчас, потом. Просто скажу, что копирований может быть минимум три, и все с разными результатами.
0
ГоффMaster
29 июня 2023, 00:09
Нет никакого массива-клона, ты его не создаёшь. Не создаётся никакого клона, связанного с оригиналом. Обе переменные просто ссылаются на один и тот же массив. Если ты через одну переменную обращаешься к массиву и вносишь изменения, то они тут же видны и при обращении к массиву через другую переменную. Это как два паспорта с одинаковым адресом - по какому ни пойдёшь, окажешься в той же квартире..
0
BlackStar_Marusa
29 июня 2023, 23:49
Звучит вполне интересно. На каком этапе стоит ознакомиться с этими способами копирования? Спасибо за объяснение!
0
ГоффMaster
30 июня 2023, 08:43
Как только разберёшься со ссылочными переменными, придётся разобраться и с копированием.
Если вкратце:
1. Копирование ссылки на массив, как у тебя. Массив остаётся один, просто теперь на него ссылаются две разных переменных. Это нужно, например, когда у нас несколько массивов и нам нужно как то между ними переключаться - это переключение можно сделать через вспомогательную переменную, которая будет указывать то на один, то на другой массив.
2. Поверхностное копирование. Создаётся второй массив, идентичный первому, его копия. Теперь у нас два независимых друг от друга массива. Это отлично работает, если в массиве только примитивы.
3. Глубокое копирование. Если в массиве ссылочные переменные, например, это массив строк, то поверхностное копирование может быть не достаточно, требуется глубокое. При поверхностном копировании в новый массив копируются ссылки на объекты. То-есть у нас есть независимый от первого второй массив, мы можем его изменять, добавлять, что-то удалять. Но как только мы изменим какой-нибудь элемент массива, то это изменение отразится и в первом массиве, потому что и в первом, и во втором элемент ссылается на один и тот же объект. При глубоком копирований создаётся не только копия самого массива, но и копия каждого элемента массива.
0