Список с примитивным массивом против списка с массивом объектов

#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.