Выбранный ответ: ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));
Однако важно понимать, что выбранный ответ внутренне копирует элементы несколько раз перед созданием окончательного массива, и что есть способ уменьшить часть этой избыточности.
Начнем с понимания того, что происходит:
Сначала элементы копируются в Arrays.ArrayList<T>
, созданный статической фабрикой Arrays.asList(T...)
.
Это не создает тот же класс, что и java.lang.ArrayList
, несмотря на то, что имеет такое же простое имя класса. Он не реализует такие методы, как remove(int)
, несмотря на наличие интерфейса List. Если вы вызовете эти методы, он выдаст UnspportedMethodException
. Но если все, что вам нужно, это список фиксированного размера, вы можете на этом остановиться.
Затем Arrays.ArrayList<T>
, созданный в # 1, передается конструктору ArrayList<>(Collection<T>)
, где вызывается метод collection.toArray()
для его клонирования.
public ArrayList(Collection<? extends E> collection) {
......
Object[] a = collection.toArray();
}
Затем конструктор решает, следует ли принять клонированный массив или снова скопировать его, чтобы удалить тип подкласса. Поскольку Arrays.asList(T...)
внутренне использует массив типа T, тот самый, который мы передали в качестве параметра, конструктор всегда отклоняет использование клона, если T не является чистым объектом. (Например, String, Integer и т. Д. Все снова копируются, потому что они расширяют Object).
if (a.getClass() != Object[].class) {
//Arrays.asList(T...) is always true here
//when T subclasses object
Object[] newArray = new Object[a.length];
System.arraycopy(a, 0, newArray, 0, a.length);
a = newArray;
}
array = a;
size = a.length;
Таким образом, наши данные были скопированы 3 раза просто для явной инициализации ArrayList. Мы могли бы уменьшить его до 2x, если мы заставим Arrays.AsList(T...)
создать массив Object [], чтобы ArrayList мог позже принять его, что можно сделать следующим образом:
(List<Integer>)(List<?>) new ArrayList<>(Arrays.asList((Object) 1, 2 ,3, 4, 5));
Или, может быть, просто добавление элементов после создания может быть наиболее эффективным.
person
NameSpace
schedule
19.01.2016