Как создать 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));
просто?
Ответы
Ответ 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));