Ответ 1
Создайте новый ArrayList
с помощью конструктора:
List<String> list = new ArrayList<String>(Arrays.asList("a", "b"));
Мы не можем выполнить операцию <Collection>.add
или <Collection>.addAll
для коллекций, полученных нами из Arrays.asList
. Разрешена только операция удаления.
Итак, если я столкнулся с сценарием, когда мне нужно добавить новый элемент в List
, не удаляя предыдущие элементы в List
?. Как я могу достичь этого?
Создайте новый ArrayList
с помощью конструктора:
List<String> list = new ArrayList<String>(Arrays.asList("a", "b"));
Один из способов - создать новый ArrayList
:
List<T> list = new ArrayList<T>(Arrays.asList(...));
Сделав это, вы можете изменить list
, как вам удобно.
Конструктор для коллекции, такой как ArrayList, в следующем примере, возьмет массив в виде списка и построит новый экземпляр с элементами этого списка.
List<T> list = new ArrayList<T>(Arrays.asList(...));
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection)
Arrays.asList() генерирует список, который фактически поддерживается массивом, и представляет собой массив, который преобразуется как список. Вы можете использовать его в качестве списка, но вы не можете выполнять определенные операции над ним, например, добавлять новые элементы. Поэтому лучший вариант - передать его конструктору другого списка obj следующим образом:
List<T> list = new ArrayList<T>(Arrays.asList(...));
Вы можете обойти промежуточный ArrayList
с потоками Java8:
Integer[] array = {1, 2, 3};
List<Integer> list = Streams.concat(Arrays.stream(array),
Stream.of(4)).collect(Collectors.toList());
Это должно быть довольно эффективно, поскольку оно может просто перебирать массив, а также предварительно назначать целевой список. Это может быть или не быть лучше для больших массивов. Как всегда, если это важно, вы должны измерять.