#java #arrays #list
#java #массивы #Список
Вопрос:
У меня есть приведенный ниже фрагмент кода для замены.
public static <E> void swap(List<E> list, int i, int j){
E temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
Теперь, когда я использую список, поддерживаемый целочисленным массивом, как показано ниже
Integer[] ar = new Integer[]{1,2};
swap(Arrays.asList(ar),1,0);
Он отлично работает и выдает вывод в виде [2,1]
Но я использую список, поддерживаемый массивом int, как показано ниже
int[] ar = new int[]{1,2};
swap(Arrays.asList(ar),1,0);
Он вызывает исключение ArrayIndexOutOfBounds. Я не понимаю, почему это происходит. Список должен обрабатывать элемент int только как объект. Пожалуйста, помогите.
Комментарии:
1. Добавление некоторого мусорного текста для удовлетворения минимальных требований к публикации вопроса смешно.
2. Спасибо Аникету. Мне нравится ваш ответ 🙂
3. @AniketSahrawat Я на самом деле удивлен, что текст мусора вообще был необходим. Конечно, сегодня я видел более короткие вопросы, поэтому это не может быть только требованием длины.
4. @TimBiegeleisen Я думаю, что учитывается соотношение кода и текста. Никогда не читал об этом.
5. Если это отношение текста к коду, @UtpalKumar должен был быть в порядке, если бы он не включил большинство своих вопросов в блок кода.
Ответ №1:
Вот что происходит. Ваш текущий код фактически создает a List<Object>
, который содержит только одно int[]
, а не список фактических целых чисел:
int[] ar = new int[]{1,2};
List<Object> list = Arrays.asList(ar);
Причиной ArrayIndexOutOfBounds
исключения является то, что список, который вы передаете swap
методу, имеет только одну запись с нулевым индексом.
В любом случае, невозможно использовать Arrays.asList
для прямого преобразования массива примитивов в список некоторого коробочного типа. Первая версия вашего кода верна, и это то, что вы должны использовать:
Integer[] ar = new Integer[] {1, 2};
swap(Arrays.asList(ar), 1, 0);
Комментарии:
1. В обоих случаях, т.Е. Массив объектов-примитивов и оболочек, я передаю только ссылку на объект массива в метод swap, где он рассматривается как список и на него ссылается объект list. Я все еще не понимаю, как я передаю один int[] . Это как-то связано с внутренней структурой обоих массивов.
2. В том-то и дело,
viewed as List
что это не значит, что вы думаете. То, как вы вызываетеArrays.asList
без указания типа, означает, что по умолчаниюList<Object>
он равен , с одной записью для примитивного массива. Он не «знает», что вам нужен список целых чисел.3. Я думаю, вы правы, когда я делаю это «int[] ar1 = new int[]{1,2}; System.out.println(Arrays.asList(ar1).size());» он возвращает 1.