Правильное удаление целого числа из списка <Целое число>
Вот хорошая ошибка, с которой я только что столкнулся. Рассмотрим список целых чисел:
List<Integer> list = newArrayList<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).