Будьте осторожны, когда вы пытаетесь использовать 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”