Вопрос-ответ

Properly removing an Integer from a List

Правильное удаление целого числа из списка <Целое число>

Вот хорошая ошибка, с которой я только что столкнулся. Рассмотрим список целых чисел:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(6);
list.add(7);
list.add(1);

Есть обоснованные предположения о том, что происходит при выполненииlist.remove(1)? Как насчет list.remove(new Integer(1))? Это может вызвать некоторые неприятные ошибки.

Как правильно различать remove(int index), который удаляет элемент из заданного индекса, и remove(Object o), который удаляет элемент по ссылке, при работе со списками целых чисел?


Здесь следует учитывать главный момент, о котором упоминал @Nikita - точное соответствие параметров имеет приоритет над автоматической упаковкой.

Переведено автоматически
Ответ 1

Java всегда вызывает метод, который наилучшим образом соответствует вашему аргументу. Автоматическая обработка и неявная обработка с повышением выполняется только в том случае, если нет метода, который можно вызвать без преобразования / автоматической обработки.

Интерфейс List определяет два метода удаления (пожалуйста, обратите внимание на имена аргументов):


  • remove(Object o)

  • remove(int index)

Это означает, что list.remove(1) удаляет объект в позиции 1 и remove(new Integer(1)) удаляет первое вхождение указанного элемента из этого списка.

Ответ 2

Вы можете использовать приведение

list.remove((int) n);

и

list.remove((Integer) n);

Не имеет значения, является ли n значением int или Integer , метод всегда будет вызывать тот, который вы ожидаете.

Использование (Integer) n или Integer.valueOf(n) более эффективно, чем new Integer(n) поскольку первые два могут использовать кэш целых чисел, тогда как более поздние всегда будут создавать объект.

Ответ 3

Я не знаю о "правильном" способе, но предложенный вами способ работает просто отлично:

list.remove(int_parameter);

удаляет элемент в заданной позиции и

list.remove(Integer_parameter);

удаляет данный объект из списка.

Это потому, что виртуальная машина сначала пытается найти метод, объявленный с точно таким же типом параметра, и только затем пытается выполнить автоматическую блокировку.

Ответ 4

list.remove(4) это точное соответствие list.remove(int index), поэтому оно будет вызвано. Если вы хотите вызвать list.remove(Object), выполните следующее: list.remove((Integer)4).

java collections