Вопрос-ответ

Create ArrayList from array

Создать список массивов из массива
Element[] array = {new Element(1), new Element(2), new Element(3)};

Как мне преобразовать указанную выше переменную типа Element[] в переменную типа ArrayList<Element>?

ArrayList<Element> arrayList = ...;
Переведено автоматически
Ответ 1

Вы можете воспользоваться следующей инструкцией:

new ArrayList<>(Arrays.asList(array));
Ответ 2

Дано:

Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };

Самый простой ответ - сделать:

List<Element> list = Arrays.asList(array);

Это будет работать нормально. Но с некоторыми оговорками:


  1. Список, возвращаемый из asList, имеет фиксированный размер. Итак, если вы хотите иметь возможность добавлять или удалять элементы из возвращаемого списка в своем коде, вам нужно будет обернуть его в новый ArrayList. В противном случае вы получите UnsupportedOperationException.

  2. Список, возвращаемый из asList(), поддерживается исходным массивом. Если вы измените исходный массив, список также будет изменен. Это может удивить.

Ответ 3

(старый поток, но всего 2 цента, поскольку ни в одном не упоминается Guava или другие библиотеки и некоторые другие детали)

Если вы можете, используйте Guava

Стоит указать на способ Guava, который значительно упрощает эти манипуляции:

Использование

Для неизменяемого списка

Используйте ImmutableList класс и его of() и copyOf() фабричные методы (элементы не могут быть нулевыми):

List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array

Для изменяемого списка

Используйте Lists класс и его newArrayList() заводские методы:

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

Пожалуйста, также обратите внимание на аналогичные методы для других структур данных в других классах, например в Sets.

Почему Guava?

Основной привлекательностью может быть уменьшение беспорядка из-за универсальности для обеспечения безопасности типов, поскольку использование заводских методов Guava позволяет большую часть времени определять типы. Однако этот аргумент содержит меньше аргументов, поскольку Java 7 появилась с новым оператором diamond.

Но это не единственная причина (и Java 7 еще не везде): сокращенный синтаксис также очень удобен, а инициализаторы методов, как видно выше, позволяют писать более выразительный код. Вы выполняете за один вызов Guava то, что занимает 2 с текущими коллекциями Java.


Если вы не можете...

Для неизменяемого списка

Используйте Arrays класс JDK и его asList() фабричный метод, завернутый в Collections.unmodifiableList():

List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));

Обратите внимание, что возвращаемый тип для asList() является List использующим конкретную ArrayList реализацию, но это НЕ java.util.ArrayList. Это внутренний тип, который эмулирует ArrayList но на самом деле напрямую ссылается на переданный массив и выполняет в нем "сквозную запись" (изменения отражены в массиве).

Он запрещает модификации с помощью некоторых методов List API путем простого расширения AbstractList (таким образом, добавление или удаление элементов не поддерживается), однако он позволяет вызовам set() переопределять элементы. Таким образом, этот список на самом деле не является неизменяемым, и вызов asList() следует обернуть с помощью Collections.unmodifiableList().

Смотрите следующий шаг, если вам нужен изменяемый список.

Для изменяемого списка

То же, что и выше, но обернуто фактическим java.util.ArrayList:

List<String> l1  = new ArrayList<String>(Arrays.asList(array));    // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+

For Educational Purposes: The Good ol' Manual Way

// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);

for (final T s : array) {
l.add(s);
}
return (l);
}

// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);

for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}
Ответ 4

Поскольку этот вопрос довольно старый, меня удивляет, что никто еще не предложил простейшую форму:

List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));

Начиная с Java 5, Arrays.asList() принимает параметр varargs, и вам не нужно создавать массив явно.

2023-03-22 15:31 java arrays arraylist