3933

我有一个初始化为的数组:

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

我想将此数组转换为ArrayList该类的对象。

ArrayList<Element> arraylist = ???;
4

39 回答 39

4937
new ArrayList<>(Arrays.asList(array));
于 2008-10-01T14:39:12.010 回答
975

鉴于:

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()由原始数组支持。如果修改原始数组,列表也会被修改。这可能令人惊讶。
于 2008-10-01T15:39:06.903 回答
375

(旧线程,但只有 2 美分,因为没有提到番石榴或其他库和其他一些细节)

如果可以,请使用番石榴

值得指出的是 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工厂方法允许在大多数时间推断类型。然而,自从 Java 7 与新的菱形运算符一起出现以来,这个论点就不那么成立了。

但这不是唯一的原因(Java 7 还不是无处不在):速记语法也非常方便,方法初始化器,如上所示,允许编写更具表现力的代码。您可以在一个 Guava 调用中执行当前 Java 集合需要 2 的操作。


如果你不能...

对于不可变列表

使用 JDK 的Arrays类及其asList()工厂方法,用Collections.unmodifiableList():

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

请注意,返回的类型为asList()aList使用具体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 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);
}
于 2012-11-16T17:16:41.463 回答
248

由于这个问题已经很老了,令我惊讶的是,还没有人提出最简单的形式:

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

从 Java 5 开始,Arrays.asList()采用 varargs 参数,您不必显式构造数组。

于 2011-06-22T11:30:23.463 回答
223
new ArrayList<T>(Arrays.asList(myArray));

确保它myArrayT. 例如,如果您尝试List<Integer>从 的数组创建 a,您将收到编译器错误int

于 2008-10-01T14:40:46.607 回答
111

另一种方式(虽然在性能方面基本上等同于new ArrayList(Arrays.asList(array))解决方案:

Collections.addAll(arraylist, array);
于 2012-04-03T23:20:55.823 回答
109

爪哇 9

Java 9中,您可以使用List.of静态工厂方法来创建List文字。类似于以下内容:

List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));

这将返回一个包含三个元素的不可变列表。如果您想要一个可变列表,请将该列表传递给ArrayList构造函数:

new ArrayList<>(List.of(// elements vararg))

JEP 269:集合的便利工厂方法

JEP 269为Java Collections API提供了一些便利的工厂方法。这些不可变的静态工厂方法内置于 Java 9 及更高版本的 、 和 接口ListSetMap

于 2016-04-17T16:58:35.317 回答
90

您可能只需要一个列表,而不是一个 ArrayList。在这种情况下,您可以这样做:

List<Element> arraylist = Arrays.asList(array);
于 2008-10-01T14:45:02.917 回答
76

另一个更新,即将于 2014 年结束,您也可以使用 Java 8:

ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));

一些字符将被保存,如果这可能只是一个List

List<Element> list = Stream.of(myArray).collect(Collectors.toList());
于 2014-11-25T20:48:36.917 回答
48

如果您使用:

new ArrayList<T>(Arrays.asList(myArray));

可以创建并填写两个列表!填充两次大列表正是您不想做的,因为Object[]每次需要扩展容量时它都会创建另一个数组。

幸运的是,JDK 的实现速度很快,而且Arrays.asList(a[])做得很好。它创建一种名为 Arrays.ArrayList 的 ArrayList,其中 Object[] 数据直接指向该数组。

// in Arrays
@SafeVarargs
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
//still in Arrays, creating a private unseen class
private static class ArrayList<E>

    private final E[] a;    
    ArrayList(E[] array) {
        a = array; // you point to the previous array
    }
    ....
}

危险的一面是,如果你改变了初始数组,你就改变了 List !你确定你想要那个吗?可能是可能不是。

如果没有,最容易理解的方法是这样做:

ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity
for (Element element : myArray) {
    list.add(element);
}

或者如@glglgl 所说,您可以使用以下命令创建另一个独立的 ArrayList:

new ArrayList<T>(Arrays.asList(myArray));

我喜欢使用Collections,Arrays或 Guava。但如果它不合适,或者你没有感觉,那就写另一条不雅的行来代替。

于 2014-01-18T13:01:42.113 回答
41

Java 9您可以使用:

List<String> list = List.of("Hello", "World", "from", "Java");
List<Integer> list = List.of(1, 2, 3, 4, 5);
于 2017-04-11T12:20:45.653 回答
36

根据问题,使用 java 1.7 的答案是:

ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array));

但是最好总是使用界面:

List<Element> arraylist = Arrays.<Element>asList(array);
于 2015-05-17T22:07:25.277 回答
33
// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray); 
于 2014-01-07T06:04:45.857 回答
26

从 Java 8 开始,有一种更简单的转换方法:

import java.util.List;    
import static java.util.stream.Collectors.toList;

public static <T> List<T> fromArray(T[] array) {
    return Arrays.stream(array).collect(toList());
}
于 2016-12-23T12:31:28.400 回答
25

您可以使用不同的方法进行转换

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

  2. List<Element> list = new ArrayList();
    Collections.addAll(list, array);

  3. Arraylist list = new Arraylist();
    list.addAll(Arrays.asList(array));

有关更多详细信息,您可以参考http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html

于 2016-05-02T08:40:44.647 回答
24

就像所有人说的那样

 new ArrayList<>(Arrays.asList("1","2","3","4"));

创建数组的常见最新方法是observableArrays

ObservableList:允许侦听器在发生更改时跟踪更改的列表。

对于 Java SE,您可以尝试

FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));

这是根据Oracle Docs

observableArrayList() 创建一个由 arraylist 支持的新的空 observable 列表。observableArrayList(E... items) 创建一个新的可观察数组列表,其中添加了项目。

更新 Java 9

在 Java 9 中也有一点简单:

List<String> list = List.of("element 1", "element 2", "element 3");
于 2017-01-05T18:32:55.717 回答
22

您也可以使用 Java 8 中的流来实现。

 List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 
于 2016-02-06T08:56:21.030 回答
18
  1. 如果我们看到Arrays.asList()方法的定义,你会得到这样的:

     public static <T> List<T> asList(T... a) //varargs are of T type. 
    

    所以,你可以arraylist这样初始化:

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

    注意:每个都new Element(int args)将被视为单个对象,并且可以作为var-args.

  2. 这个问题也可能有另一个答案。
    如果您看到java.util.Collections.addAll()方法声明,您将得到如下信息:

    public static <T> boolean addAll(Collection<? super T> c, T... a);
    

    因此,此代码也很有用

    Collections.addAll(arraylist, array);
    
于 2016-03-30T06:48:14.027 回答
12

另一种简单的方法是使用 for-each 循环将数组中的所有元素添加到新的 ArrayList 中。

ArrayList<Element> list = new ArrayList<>();

for(Element e : array)
    list.add(e);
于 2015-12-16T20:32:39.263 回答
12

如果数组是原始类型,则给定的答案将不起作用。但从 Java 8 开始,您可以使用:

int[] array = new int[5];
Arrays.stream(array).boxed().collect(Collectors.toList());
于 2017-07-10T02:21:29.697 回答
9

即使这个问题有很多完美的书面答案,我也会添加我的输入。

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

可以通过以下方式创建新的 ArrayList

ArrayList<Element> arraylist_1 = new ArrayList<>(Arrays.asList(array));
ArrayList<Element> arraylist_2 = new ArrayList<>(
    Arrays.asList(new Element[] { new Element(1), new Element(2), new Element(3) }));

// Add through a collection
ArrayList<Element> arraylist_3 = new ArrayList<>();
Collections.addAll(arraylist_3, array);

并且它们很好地支持 ArrayList 的所有操作

arraylist_1.add(new Element(4)); // or remove(): Success
arraylist_2.add(new Element(4)); // or remove(): Success
arraylist_3.add(new Element(4)); // or remove(): Success

但以下操作仅返回 ArrayList 的 List 视图,而不是实际的 ArrayList。

// Returns a List view of array and not actual ArrayList
List<Element> listView_1 = (List<Element>) Arrays.asList(array);
List<Element> listView_2 = Arrays.asList(array);
List<Element> listView_3 = Arrays.asList(new Element(1), new Element(2), new Element(3));

因此,它们在尝试进行一些 ArrayList 操作时会出错

listView_1.add(new Element(4)); // Error
listView_2.add(new Element(4)); // Error
listView_3.add(new Element(4)); // Error

更多关于数组链接的列表表示。

于 2017-04-07T18:45:50.753 回答
9

最简单的方法是添加以下代码。久经考验。

String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));
于 2017-05-03T08:38:28.200 回答
9

您可以在 java 8 中执行以下操作

ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());
于 2017-06-07T12:14:25.317 回答
9

另一个Java8解决方案(我可能错过了大集合中的答案。如果是这样,我很抱歉)。这会创建一个 ArrayList(与 List 相对),即可以删除元素

package package org.something.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Junk {

    static <T> ArrayList<T>  arrToArrayList(T[] arr){
        return Arrays.asList(arr)
            .stream()
            .collect(Collectors.toCollection(ArrayList::new));
    }

    public static void main(String[] args) {
        String[] sArr = new String[]{"Hello", "cruel", "world"};
        List<String> ret = arrToArrayList(sArr);
        // Verify one can remove an item and print list to verify so
        ret.remove(1);
        ret.stream()
            .forEach(System.out::println);
    }
}

输出是......
你好
世界

于 2017-06-20T08:33:05.757 回答
9

我们可以轻松地将数组转换为ArrayList. 我们使用 Collection 接口的addAll()方法将内容从一个列表复制到另一个列表。

 Arraylist arr = new Arraylist();
 arr.addAll(Arrays.asList(asset));
于 2017-07-04T07:22:33.683 回答
9

使用以下代码将元素数组转换为 ArrayList。

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

ArrayList<Element>elementArray=new ArrayList();
for(int i=0;i<array.length;i++) {
    elementArray.add(array[i]);
}
于 2018-12-03T11:32:10.090 回答
7

给定对象数组:

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

将数组转换为列表:

    List<Element> list = Arrays.stream(array).collect(Collectors.toList());

将数组转换为 ArrayList

    ArrayList<Element> arrayList = Arrays.stream(array)
                                       .collect(Collectors.toCollection(ArrayList::new));

将数组转换为链表

    LinkedList<Element> linkedList = Arrays.stream(array)
                     .collect(Collectors.toCollection(LinkedList::new));

打印清单:

    list.forEach(element -> {
        System.out.println(element.i);
    });

输出

1

2

3

于 2019-09-07T20:36:28.793 回答
6

每个人都已经为您的问题提供了足够好的答案。现在从所有建议中,您需要确定哪个适合您的要求。您需要了解两种类型的集合。一个是未修改的集合,另一个是允许您稍后修改对象的集合。

因此,在这里我将给出两个用例的简短示例。

  • 不可变集合创建 :: 当你不想在创建后修改集合对象时

    List<Element> elementList = Arrays.asList(array)

  • 可变集合创建 :: 当您可能希望在创建后修改已创建的集合对象时。

    List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));

于 2017-07-25T06:03:11.847 回答
6

Java 8 的 Arrays 类提供了一个 stream() 方法,该方法具有接受原始数组和对象数组的重载版本。

/**** Converting a Primitive 'int' Array to List ****/

int intArray[] = {1, 2, 3, 4, 5};

List<Integer> integerList1 = Arrays.stream(intArray).boxed().collect(Collectors.toList());

/**** 'IntStream.of' or 'Arrays.stream' Gives The Same Output ****/

List<Integer> integerList2 = IntStream.of(intArray).boxed().collect(Collectors.toList());

/**** Converting an 'Integer' Array to List ****/

Integer integerArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

List<Integer> integerList3 = Arrays.stream(integerArray).collect(Collectors.toList());
于 2019-05-19T11:20:27.540 回答
5

下面的代码似乎是这样做的好方法。

new ArrayList<T>(Arrays.asList(myArray));
于 2019-12-04T07:59:42.910 回答
3

对于正常大小的数组,上面的答案很好。如果您有很大的数组并使用 java 8,您可以使用流来完成。

  Element[] array = {new Element(1), new Element(2), new Element(3)};
  List<Element> list = Arrays.stream(array).collect(Collectors.toList());
于 2020-11-18T12:45:57.733 回答
2

ArrayList您可以使用Cactoos创建一个(我是开发人员之一):

List<String> names = new StickyList<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

不能保证该对象实际上是 class ArrayList。如果您需要该保证,请执行以下操作:

ArrayList<String> list = new ArrayList<>(
  new StickyList<>(
    "Scott Fitzgerald", "Fyodor Dostoyevsky"
  )
);
于 2017-06-26T12:19:51.840 回答
2

生成类型 ArrayList<Element>
(1) 的列表的 lambda 表达式,没有未经检查的强制转换
(2),而不创建第二个列表(例如。asList()

ArrayList<Element> list = Stream.of( array ).collect( Collectors.toCollection( ArrayList::new ) );

于 2019-08-02T05:50:11.953 回答
2

在java中主要有3种方法将数组转换为arrayList

  1. 使用 Arrays.asList() 方法:将所需的数组传递给该方法并获取一个 List 对象并将其作为参数传递给 ArrayList 类的构造函数。

    List<String> list = Arrays.asList(array);                   
    System.out.println(list);
    
  2. Collections.addAll() 方法 - 在使用此方法之前创建一个新列表,然后使用此方法将数组元素添加到现有列表中。

     List<String> list1 = new ArrayList<String>();
     Collections.addAll(list1, array);
     System.out.println(list1);
    
  3. 迭代方法 - 创建一个新列表。迭代数组并将每个元素添加到列表中。

     List<String> list2 = new ArrayList<String>();
     for(String text:array) {
         list2.add(text);
     }
     System.out.println(list2);
    

你也可以参考这个文件

于 2020-09-24T11:27:20.967 回答
2

您可以使用以下 3 种方式从 Array 创建 ArrayList。

  String[] array = {"a", "b", "c", "d", "e"};

  //Method 1
  List<String> list = Arrays.asList(array);          

  //Method 2
  List<String> list1 = new ArrayList<String>();
  Collections.addAll(list1, array);

  //Method 3
  List<String> list2 = new ArrayList<String>();
  for(String text:array) {
     list2.add(text);
  }
于 2020-10-21T04:24:37.477 回答
2

还有另一种方法可用于将数组转换为 ArrayList。您可以遍历数组并将每个索引插入到 ArrayList 中,然后像在 ArrayList 中一样将其返回。

这如下所示。

public static void main(String[] args) {
        String[] array = {new String("David"), new String("John"), new String("Mike")};

        ArrayList<String> theArrayList = convertToArrayList(array);
    }

    private static ArrayList<String> convertToArrayList(String[] array) {
        ArrayList<String> convertedArray = new ArrayList<String>();

        for (String element : array) {
            convertedArray.add(element);
        }

        return convertedArray;
    }
于 2020-11-17T03:39:28.670 回答
1

嗨,你可以使用这个line of code,这是最简单的方法

 new ArrayList<>(Arrays.asList(myArray));

或者如果你使用 Java 9你也可以使用这个方法:

List<String> list = List.of("Hello", "Java"); 
List<Integer> list = List.of(1, 2, 3);
于 2020-07-06T08:13:56.623 回答
1

您还可以在调用Arrays -interface 时使用多态性来声明ArrayList,如下所示:

List<Element> arraylist = new ArrayList<Integer>(Arrays.asList(array));

例子:

Integer[] array = {1};    // autoboxing
List<Integer> arraylist = new ArrayList<Integer>(Arrays.asList(array));

这应该像一个魅力。

于 2021-06-16T13:28:18.660 回答
0

使用下面的代码

Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element> list = (ArrayList) Arrays.asList(array);
于 2019-03-28T11:42:43.403 回答