Ребята, напомните почему в функции нельзя присвоить все значения одного массива другому просто через "="? В моём примере 31 cтрока: array=tmp;
Т.е если я вывожу System.out.println(Arrays.toString(array)); внутри функции, то значения массива изменяются, а в main массив остаётся прежним. Через for и присваивания каждого элемента одного массива другому всё работает как надо. Хотел тут скрин полного кода программы вкинуть, но видимо тут это не желательно. ![]()
Jump Java
39 уровень
Присваивание значений массива
Архивный
Комментарии (16)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Максим Максимов
5 января 2025, 20:17
Всем спасибо! Тоже попался на этом же "присваивании массива через =". Причем остальной код был правильный и один в один как в "правильном решении". В итоге пока решал (не понимая в чем проблема) решил вообще код переписать и вышел на решение без создания нового массива:
public static void executeDefragmentation(String[] array) {
int counter = array.length - 1;
for (int i = 0; i < counter; i++) {
if (array[i] == null) {
for (int j = i; j < array.length - 1; j++) {
array[j] = array[j + 1];
}
array[array.length - 1] = null;
i--;
counter--;
}
}
}
0
hidden #3303140
16 октября 2023, 11:42полезный
Задача твоего метода - отсортировать элементы в том массиве, который приходит в метод параметром.
Когда ты выполняешь операцию присваивания array = tmp, ты тем самым помещаешь в переменную array ссылку на другой объект (новый массив), что никак не меняет порядка элементов в исходном массиве - ты просто перестал им пользоваться и выбросил его.
+1
Jump Java
17 октября 2023, 08:53
Спасибо!
0
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
16 октября 2023, 11:27полезный
Да, хотелось бы полностью код увидеть, но насчет вопроса:
так получается, потому что выводится результат операции над исходным массивом, но сам результат никуда не сохраняется
Вот пример
+3
Jump Java
17 октября 2023, 08:53
Спасибо!
0
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
17 октября 2023, 09:05
А разобрался полностью с задачей? Может скинешь полностью код? Прям в комментариях тут можешь код вставить, выделить его и нажать кнопку code![]()
0
Jump Java
17 октября 2023, 09:22
Честно, не до конца разобрался, так и не понял полностью почему именно в функции после присваивания одного массива другому через "=" массив будет изменяться, а в main при вызове функции и последующем выводе массива array он будет изначальным. Если каждый элемент по отдельности в for присваивать, то всё окей.
Вот код:
0
hidden #3303140
17 октября 2023, 10:06
Потому что ты не понимаешь, как работают ссылочные типы данных. Нельзя "присвоить массиву массив", как ты пишешь.
Чтобы разобраться, нужно начать с того, что такое объект и что такое переменная и в чём между ними разница.
В ООП и в джаве в частности любые данные, кроме восьми примитивных типов (int, boolean, long, double и тд) являются объектами. Это касается и массивов, любой массив является объектом. Объекты существуют в т.н. куче (англ. heap) - это область в памяти компьютера, предназначенная для хранения этих самых объектов. Можешь буквально представить себе неупорядоченную кучу объектов, сваленных в одну гору. То есть объекты хранятся в этой куче, а вовсе не в переменных. А что же хранится в переменных? В переменных хранятся ссылки на эти типы данных, которые как ниточки связывают каждую переменную с тем объектом из кучи, на который она ссылается. Именно поэтому не примитивные типы данных называются ссылочными.
Оператор присваивания "=" по сути создаёт ссылку на объект в куче и помещает её в переменную.
Если у тебя есть переменная x, и она хранит некоторую ссылку, и ты выполняешь команду y = x, то это означает, что ты берёшь ссылку, которая содержится в переменной x и помещаешь такую же в переменную y. Получается, у тебя две переменные ссылаются на один и тот же массив. Массивов у тебя из-за этого в куче не стало два, просто к одному массиву в куче привязано две "ниточки": одна к переменной x, другая к переменной y.
А что если у тебя в переменной y до этого присваивания была другая ссылка, которая вела к другому объекту? Каждая переменная хранит только одну ссылку, поэтому когда ты поместил новую ссылку, старая оттуда удалилась, и переменная y отвязалась от того объекта, к которому она была привязана (говорят, на который ссылалась эта переменная). И тот первый массив остался лежать в куче, ни к чему не привязанный.
Продолжение ниже
+4
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
17 октября 2023, 10:09
+3
hidden #3303140
17 октября 2023, 10:13решение
В тот момент, когда не остаётся ни одной переменной в программе, которая ссылалась бы на какой-то объект, то доступ к этому объекту теряется, и его уничтожает специальный инструмент, называемый сборщиком мусора (garbage collector, GC).
В твоей программе создаётся массив строк, ссылка на который помещается в переменную memory. Когда ты вызываешь метод executeDefragmentation, ты эту же ссылку помещаешь в параметр метода, переменную array. Эти две ссылки ссылаются на один и тот же объект. Затем ты внутри метода создаёшь новый массив, помещаешь ссылку на него в переменную mem, сортируешь массив в переменной mem.
Затем ты выполняешь операцию array = mem, то есть помещаешь в переменную array ссылку на тот массив, который хранится в переменной mem. Первоначальная ссылка, которая была получена из мейна при этом из неё пропадает. Получается, что переменная memory в мейне и переменная array в методе executeDefr. ссылаются на разные массивы, и теперь работа с переменной array никак не отразится на массиве, на который ссылается переменная memory, и сортировка не выполняется.
А если ты не выполняешь операцию присваивания, то в переменной array хранится та же самая ссылка, что и в memory. И по какой из ссылок ты не обратишься, ты обратишься к тому же самому массиву.
+5
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
17 октября 2023, 10:20решение
В 5-й строчке происходит следующее Таким образом, переменная array начинает ссылаться на массив memory. Затем в методе executeDefragmentation создается массив mem, в котором ячейки сортируются как надо в задаче. В 23 строчке переменная array начинается ссылаться на новый массив mem. При этом до этого она ссылалась на массив memory. И таким образом, в 25 строчке распечатывается array, которая ссылается на mem.
А вот именно в 26 и 27 строчках меняется исходный массив memory. То есть, если нету строк 23 и 24, в 26 и 27 строках каждой ячейке массива array присваивается каждая ячейка нового массива mem. И так как array ссылается на тот же массив, на который ссылается memory, то меняется исходный массив, который и нужно нам поменять
+3
Jump Java
17 октября 2023, 12:39
Спасибо, с вашей помощью разобрался, помогло!
0
Jump Java
17 октября 2023, 12:43
Именно этих ответов я и ждал, спасибо)
0
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
17 октября 2023, 13:10
Успехов! Если что-то будет непонятно, спрашивай!
0
Сирёга
16 октября 2023, 00:14
Нужно из задачи вопрос задавать, чтобы можно было код увидеть. Скрин точно не надо
0
Jump Java
17 октября 2023, 08:50
После того как задача проходит проверку, то вроде как нельзя уже задать вопрос, чтобы был виден код, но это не точно)
0