Рубрики
Без рубрики

Инт против Целочисленная ошибка Java ArrayList.remove()

Будьте осторожны, когда пытаетесь использовать ArrayList.remove() для удаления определенных элементов u… С пометкой java, новички, отладка, подводные камни.

Будьте осторожны, когда вы пытаетесь использовать ArrayList.remove() для удаления определенных элементов с использованием вставленного целого числа вместо примитива int — вы, вероятно, не получите ожидаемого результата:

jshell> ArrayList alist = new ArrayList(Arrays.asList('a', 'b', 'c', 'd', 'e'))
alist ==> [a, b, c, d, e]

jshell> alist.remove((Integer)3)
$2 ==> false

jshell> alist
alist ==> [a, b, c, d, e]

…это связано с тем, что ArrayList имеет два метода remove(). Тот, который принимает java.lang. Объект , и тот , который принимает примитив int .

jshell> alist.remove(3)
$4 ==> 'd'

jshell> alist
alist ==> [a, b, c, e]

Когда вы используете первый, Java пытается сопоставить Целое число объект в вашем списке, вместо того, чтобы удалять объект по указанному индексу. В большинстве случаев это будет не то, чего вы хотите. Будьте особенно осторожны, когда делаете такие вещи, как:

jshell> ArrayList toDelete = new ArrayList(Arrays.asList(0, 2))
toDelete ==> [0, 2]

jshell> for (Integer ii : toDelete) alist.remove(ii)

jshell> alist
alist ==> [a, b, c, e]

Здесь мы не получаем никакого намека внутри оболочки на то, что что-то пошло не так (как мы сделали выше, когда remove() вернул false ). Убедитесь, что вы всегда выполняете цикл над примитивом int s:

jshell> for (int ii : toDelete) alist.remove(ii)

jshell> alist
alist ==> [b, c]

Этот пост первоначально появился в несколько иной форме на моем (ныне несуществующем) Блог на WordPress.

Оригинал: “https://dev.to/awwsmm/the-int-vs-integer-pitfall-of-javas-arraylistremove-cpm”