Подтвердить что ты не робот

Как создать ArrayList (ArrayList <Integer>) из массива (int []) в Java

Я видел вопрос: Создать ArrayList из массива

Однако, когда я пытаюсь выполнить это решение со следующим кодом, он не совсем работает во всех случаях:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class ToArrayList {

    public static void main(String[] args) {
        // this works
        String[] elements = new String[] { "Ryan", "Julie", "Bob" };
        List<String> list = new ArrayList<String>(Arrays.asList(elements));
        System.out.println(list);

        // this works
        List<Integer> intList = null;
        intList = Arrays.asList(3, 5);
        System.out.println(intList);

        int[] intArray = new int[] { 0, 1 };
        // this doesn't work!
        intList = new ArrayList<Integer>(Arrays.asList(intArray));
        System.out.println(intList);
    }
}

Что я здесь делаю неправильно? Не следует ли компилировать код intList = new ArrayList<Integer>(Arrays.asList(intArray)); просто?

4b9b3361

Ответ 1

Проблема в

intList = new ArrayList<Integer>(Arrays.asList(intArray));

заключается в том, что int[] рассматривается как единственный экземпляр Object, поскольку примитивный массив продолжается от Object. Это будет работать, если у вас есть Integer[] вместо int[], так как теперь вы отправляете массив Object.

Integer[] intArray = new Integer[] { 0, 1 };
//now you're sending a Object array
intList = new ArrayList<Integer>(Arrays.asList(intArray));

Из вашего комментария: если вы хотите по-прежнему использовать int[] (или другой массив примитивных типов) в качестве основных данных, тогда вам нужно создать дополнительный массив с классом-оболочкой. В этом примере:

int[] intArray = new int[] { 0, 1 };
Integer[] integerArray = new Integer[intArray.length];
int i = 0;
for(int intValue : intArray) {
    integerArray[i++] = intValue;
}
intList = new ArrayList<Integer>(Arrays.asList(integerArray));

Но поскольку вы уже используете цикл for, я бы не прочь использовать массив классов temp wrapper, просто добавьте свои элементы непосредственно в список:

int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
    intList.add(intValue);
}

Ответ 2

С Java 8 вы можете сделать это в одной строке:

        
int[] intArr = { 1, 1, 2, 3, 5, 8, 11};  
List<Integer> list = Arrays.stream(intArr).boxed().collect(Collectors.toList());  
list.forEach(System.out::println);

Ответ 3

Это не работает, потому что вы используете int[] вместо Integer[]. Попробуйте следующее:

Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));

Ответ 4

Проблема заключается в Autoboxing. Java автоматически преобразует int в Integer автоматически, но не конвертирует int[] в Integer[]. Отсюда и причина.

public static <T> List<T> asList(T... a)

asList определяется, как указано выше. Он ожидает vararg типа T. то есть он может принимать массив объектов типа T. В вашем случае, потому что Java не может преобразовать int[] в Integer[], поэтому для этого требуется тип T как int[], а не Integer. Следовательно, вы получаете список типов List<int[]. Вам придется вручную преобразовать его в `Integer[] из int[]

В книге Effective Java есть замечательный пункт: Джошуа Блох, где он объясняет ямы с помощью varargs, и это один из них.

Ответ 5

Коллекция хочет, чтобы объекты и примитивы не были получены из Object. поэтому Integer разрешить, но int не разрешено.

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

Только пример:

 Integer[] intArray = new Integer[] { 0, 1 };
 intList = new ArrayList<Integer>(Arrays.asList(intArray));