Как лучше всего переустановить элементы массива int[]
в ArrayList
?
Мне нужно сделать это быстро, так что будет самым быстрым способом?
Как лучше всего переустановить элементы массива int[]
в ArrayList
?
Мне нужно сделать это быстро, так что будет самым быстрым способом?
Используйте Arrays#asList(T... a)
, чтобы создать "список фиксированного размера, поддерживаемый указанным массивом". (Изменения в возвращенном списке "write through" к массиву.) "
Integer[] intArray = {1, 2, 3, 42}; // cannot use int[] here
List<Integer> intList = Arrays.asList(intArray);
Альтернативно, чтобы развязать две структуры данных:
List<Integer> intList = new ArrayList<Integer>(intArray.length);
for (int i=0; i<intArray.length; i++)
{
intList.add(intArray[i]);
}
Или еще более коротко:
List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArray));
ArrayList не является лучшим хранилищем для примитивов, таких как int. ArrayList хранит объекты не примитивы. Есть библиотеки для списков с примитивами.
Если вы действительно хотите сохранить все примитивные int
как объект Integer
, вам придется их конвертировать по одному с помощью Integer.valueOf(...)
(чтобы не создавать дополнительные экземпляры Integer, когда это не нужно).
Пока вы можете это сделать:
List<Integer> list = Arrays.asList(1, 2, 3);
Вы не можете этого сделать:
int[] i = { 1, 2, 3 };
List<Integer> list = Arrays.asList(i); // this will get you List<int[]>
как массив на самом деле является объектом, а также рассматривается как таковой в var-args при использовании примитивов, таких как int. Массивы объектов работают, хотя:
List<Object> list = Arrays.asList(new Object[2]);
Итак, что-то вроде:
int[] array = { 1, 2, 3 };
ArrayList<Integer> list = new ArrayList<Integer>(array.length);
for (int i = 0; i < array.length; i++)
list.add(Integer.valueOf(array[i]));
С Guava вам не нужно беспокоиться о Integer[]
:
int[] array;
List<Integer> list = Ints.asList(array);
и если вы хотите ArrayList
, просто
List<Integer> list = Lists.newArrayList(Ints.asList(array));
(Раскрытие: я вношу свой вклад в Гуаву.)
В противном случае, если все, что у вас есть, это int[]
, вы должны сделать это старомодно:
int[] array;
List<Integer> list = new ArrayList<>(array.length);
for (int val : array) {
list.add(val);
}
Я также предоставил альтернативный ответ, в зависимости от того, как используется List, это может работать лучше (создание выполняется быстрее, и только фактически используемые ints преобразуются, но они всегда конвертируются не только в первый раз, поэтому повторное получение того же элемента хуже). Создайте простой список оберток вокруг массива:
final int[] array = {1, 2, 3};
List list = new AbstractList<Integer>() {
public Integer get(int index) {
return array[index];
}
public Integer set(int index, Integer value) {
//or just throw new UnsupportedOperationException("..."); if not needed
Integer old = array[index];
array[index] = value;
return old;
}
public int size() {
return array.length;
}
};
или в способе создания его для вас:
static List<Integer> asList(final int[] array) {
return new AbstractList<Integer>() { ...
};
}