Насколько мне известно, вот шаги по удалению элемента в ArrayList.
nullПочему бы просто не установить элемент, который мы хотим удалить, на null? Это всего лишь один шаг.
Может ли кто-нибудь объяснить достоинства приведенной выше схемы? Заранее спасибо.
В этом разница между удалением и заменой. В последнем случае вы замените элемент нулевым объектом.
@DaisyShipton, что было бы неплохо в качестве ответа ;-)
Итак, если null в списке означает, что элемент с этим индексом «удален», то что, если я хочу, чтобы фактически сохранил null как элемент? как отличить удаленный элемент от элемента действительныйnull ?.
вы знаете, что ArrayList имеет несколько методов remove - ты не должен выполнять все эти шаги! (они вроде как требуются для массивов) - и null - допустимый элемент для вставки в ArrayList, зачем программисту он нужен?




Потому что это не одно и то же (давайте удалим "c"):
["a", "b", "d", "e"]["a", "b", null, "d", "e"]Между удалением и заменой большая разница:
"d" доступен по индексу 2 (перенесен из 3)."d" доступен по индексу 4 (без изменений).возможно также «разрешить элементы null в списке» или «как отличить желаемый null от удаленного заполнителя null (или около того)»
null всегда разрешен в списке (по определению List). Невозможно отличить желаемый null от нежелательного. Если вы хотите сохранить индексы, вы можете заменить «c» на «поддельный объект» en.wikipedia.org/wiki/Null_object_pattern.
... потому что так работают списки. Многие варианты использования нуждаются в таком динамическом изменении размера, поэтому Java имеет интерфейс для концепции списка. ArrayList - одна из нескольких реализаций List, LinkedList - другая.
У нас уже было поведение, которое вы описываете, массив, поэтому там, где вам нужно это поведение, вы можете использовать, скажем, String[].
Why don't just set the element we want to remove to null?
«установка» элемента в нуль - это не удаление элемент, это замена элемент.
Есть еще одна проблема с этим подходом: если null в списке означает, что элемент по этому индексу «удален», то что, если я действительно хочу сохранить null как элемент? как отличить удаленный элемент от действительного элемента null?
Используйте методы remove в API List<T>, не пытайтесь изобретать велосипед, они настолько хороши, насколько это возможно.
'дежавю' ! [:-) правильный ответ ИМХО на "Может ли кто-нибудь объяснить достоинства приведенной выше схемы?"
@CarlosHeuberger Вау с французскими персонажами тоже :). просто хотел указать на другую проблему, которая может возникнуть при установке для элементов значения null.
Я просто принято к сведению, что я только что прокомментировал этот вопрос (и Николас ответил)
Благодаря вашему ответу я понял, что меня запутали между «заменой (на нуль)» и «удалением». Кажется, что схема, описанная в моем вопросе, обычно называется «удалить». Теперь понял это. Большое спасибо.
ArrayLists похожи на массивы с одним отличием - их размер можно изменять (в данном примере это не имеет значения).
Рассмотрим следующий массив: [ref1,ref2,ref3,ref4], где ref1: 4 - ссылки на некоторые объекты. Это означает, что они не содержат самого объекта, они только указывают на объект. Теперь, если вы хотите удалить ref2, например, объявив его нулевым, это означает, что теперь он не будет указывать на какой-либо объект (ref2 = null), но это не означает, что сама ссылка исчезнет. Ваш новый массив (ArrayList) теперь будет [ref1,null,ref3,ref4] . Понимаете? Есть разница между заменой и удалением ....
Думайте о списке как о книге, на всех страницах которой написано. Удаление элемента похоже на удаление страницы из книги. То, что вы предлагаете, больше похоже на стирание того, что находится на странице - это совсем не та же операция. (Если ваш конкретный вариант использования подходит для того, чтобы размер списка оставался прежним и т. д., Просто позвоните
list.set(index, null)- но в большинстве случаев это не то, что требуется.)