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

How do I convert the above variable of type Element[] into a variable of type ArrayList<Element>?

ArrayList<Element> arrayList = ...; 
0

    42 Answers 42

    5146

    You can use the following instruction:

    new ArrayList<>(Arrays.asList(array)); 
    10
    • 406
      Yep. And in the (most common) case where you just want a list, the new ArrayList call is unecessary as well.
      – Calum
      CommentedOct 1, 2008 at 14:41
    • 164
      @Luron - just use List<ClassName> list = Arrays.asList(array)
      – Pool
      CommentedJun 29, 2011 at 15:18
    • 282
      @Calum and @Pool - as noted below in Alex Miller's answer, using Arrays.asList(array) without passing it into a new ArrayList object will fix the size of the list. One of the more common reasons to use an ArrayList is to be able to dynamically change its size, and your suggestion would prevent this.CommentedSep 26, 2011 at 19:04
    • 149
      Arrays.asList() is a horrible function, and you should never just use its return value as is. It breaks the List template, so always use it in the form indicated here, even if it does seem redundant. Good answer.
      – Adam
      CommentedJan 23, 2013 at 3:28
    • 87
      @Adam Please study the javadoc for java.util.List. The contract for add allows them to throw an UnsupportedOperationException. docs.oracle.com/javase/7/docs/api/java/util/… Admittedly, from an object-oriented perspective it is not very nice that many times you have to know the concrete implementation in order to use a collection - this was a pragmatic design choice in order to keep the framework simple.
      – lbalazscs
      CommentedFeb 22, 2013 at 9:41
    1010

    Given:

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

    The simplest answer is to do:

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

    This will work fine. But some caveats:

    1. The list returned from asList has fixed size. So, if you want to be able to add or remove elements from the returned list in your code, you'll need to wrap it in a new ArrayList. Otherwise you'll get an UnsupportedOperationException.
    2. The list returned from asList() is backed by the original array. If you modify the original array, the list will be modified as well. This may be surprising.
    3
    • 47
      Arrays.asList() merely creates an ArrayList by wrapping the existing array so it is O(1).CommentedMay 23, 2012 at 13:15
    • 36
      Wrapping in a new ArrayList() will cause all elements of the fixed size list to be iterated and added to the new ArrayList so is O(n).CommentedMay 23, 2012 at 13:21
    • 9
      To clarify, Arrays.asList() creates a java.util.Arrays.ArrayList (static nested class in java.util.Arrays), not a java.util.ArrayList.CommentedFeb 15, 2022 at 11:24
    403

    (old thread, but just 2 cents as none mention Guava or other libs and some other details)

    If You Can, Use Guava

    It's worth pointing out the Guava way, which greatly simplifies these shenanigans:

    Usage

    For an Immutable List

    Use the ImmutableList class and its of() and copyOf() factory methods (elements can't be null):

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

    For A Mutable List

    Use the Lists class and its newArrayList() factory methods:

    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 

    Please also note the similar methods for other data structures in other classes, for instance in Sets.

    Why Guava?

    The main attraction could be to reduce the clutter due to generics for type-safety, as the use of the Guava factory methods allow the types to be inferred most of the time. However, this argument holds less water since Java 7 arrived with the new diamond operator.

    But it's not the only reason (and Java 7 isn't everywhere yet): the shorthand syntax is also very handy, and the methods initializers, as seen above, allow to write more expressive code. You do in one Guava call what takes 2 with the current Java Collections.


    If You Can't...

    For an Immutable List

    Use the JDK's Arrays class and its asList() factory method, wrapped with a Collections.unmodifiableList():

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

    Note that the returned type for asList() is a List using a concrete ArrayList implementation, but it is NOTjava.util.ArrayList. It's an inner type, which emulates an ArrayList but actually directly references the passed array and makes it "write through" (modifications are reflected in the array).

    It forbids modifications through some of the List API's methods by way of simply extending an AbstractList (so, adding or removing elements is unsupported), however it allows calls to set() to override elements. Thus this list isn't truly immutable and a call to asList() should be wrapped with Collections.unmodifiableList().

    See the next step if you need a mutable list.

    For a Mutable List

    Same as above, but wrapped with an actual 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); } 
    1
    • 34
      +1 But note that the List returned by Arrays.asList is mutable in that you can still set elements - it just isn't resizable. For immutable lists without Guava you might mention Collections.unmodifiableList.CommentedJan 10, 2013 at 2:54
    255

    Since this question is pretty old, it surprises me that nobody suggested the simplest form yet:

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

    As of Java 5, Arrays.asList() takes a varargs parameter and you don't have to construct the array explicitly.

    2
    • 9
      In particular, List<String> a = Arrays.asList("first","second","third")CommentedJul 12, 2016 at 15:29
    • I think, the reason is 1) the requester wanted an ArrayList and 2) the result list cannot grow. So, you cannot add elements afterwards.
      – iuzuz
      CommentedFeb 23, 2024 at 12:22
    228
    new ArrayList<T>(Arrays.asList(myArray)); 

    Make sure that myArray is the same type as T. You'll get a compiler error if you try to create a List<Integer> from an array of int, for example.

    0
      115

      Java 9

      In Java 9, you can use List.of static factory method in order to create a List literal. Something like the following:

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

      This would return an immutable list containing three elements. If you want a mutable list, pass that list to the ArrayList constructor:

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

      JEP 269: Convenience Factory Methods for Collections

      JEP 269 provides some convenience factory methods for Java Collections API. These immutable static factory methods are built into the List, Set, and Map interfaces in Java 9 and later.

      1
      • 1
        List.of() will not return an instance of java.util.ArrayList, as requested in the original question. Therefore only the second option is a valid answer.
        – tquadrat
        CommentedJul 5, 2019 at 12:31
      114

      Another way (although essentially equivalent to the new ArrayList(Arrays.asList(array)) solution performance-wise:

      Collections.addAll(arraylist, array); 
      2
      • Until Java 16 the javadoc stated: The behavior of this convenience method is identical to that of c.addAll(Arrays.asList(elements)), but this method is likely to run significantly faster under most implementations.
        – cachius
        CommentedFeb 28, 2023 at 3:40
      • See this question for comparision discussion
        – cachius
        CommentedFeb 28, 2023 at 8:48
      94

      You probably just need a List, not an ArrayList. In that case you can just do:

      List<Element> arraylist = Arrays.asList(array); 
      7
      • 8
        That will be backed by the original input array, which is why you (probably) want to wrap it in a new ArrayList.CommentedOct 1, 2008 at 14:46
      • 17
        Be careful with this solution. If you look, Arrays ISN'T returning a true java.util.ArrayList. It's returning an inner class that implements the required methods, but you cannot change the memebers in the list. It's merely a wrapper around an array.
        – Mikezx6r
        CommentedOct 1, 2008 at 14:47
      • 1
        You can cast the List<Element> item to an ArrayList<Element>
        – monksy
        CommentedOct 9, 2009 at 22:48
      • 13
        @Mikezx6r: little correction: it's a fixed-size list. You can change the elements of the list (set method), you cannot change the size of the list (not add or remove elements)!
        – user85421
        CommentedDec 4, 2009 at 13:10
      • 1
        Yes, with the caveat that it depends on what you want to do with the list. It's worth notng that if the OP simply wants to iterate through the elements, the array doesn't have to be converted at all.CommentedMay 5, 2013 at 9:23
      78

      Another update, almost ending year 2014, you can do it with Java 8 too:

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

      A few characters would be saved, if this could be just a List

      List<Element> list = Stream.of(myArray).collect(Collectors.toList()); 
      3
      • 10
        It's probably best not to be implementation-dependent, but Collectors.toList() actually returns an ArrayList.
        – bcsb1001
        CommentedDec 31, 2014 at 19:55
      • incorrect use of Stream.of(...); that will create a one element stream. Use Arrays.stream insteadCommentedNov 18, 2016 at 11:59
      • I don't think so, the 2 options are valid but the Arrays.stream is slightly 'better' since you can create it with fixed size, using the overload method with 'start', 'end' args. See also: stackoverflow.com/a/27888447/2619091CommentedNov 30, 2016 at 21:45
      49

      If you use :

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

      you may create and fill two lists ! Filling twice a big list is exactly what you don't want to do because it will create another Object[] array each time the capacity needs to be extended.

      Fortunately the JDK implementation is fast and Arrays.asList(a[]) is very well done. It create a kind of ArrayList named Arrays.ArrayList where the Object[] data points directly to the array.

      // 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 } .... } 

      The dangerous side is that if you change the initial array, you change the List ! Are you sure you want that ? Maybe yes, maybe not.

      If not, the most understandable way is to do this :

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

      Or as said @glglgl, you can create another independant ArrayList with :

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

      I love to use Collections, Arrays, or Guava. But if it don't fit, or you don't feel it, just write another inelegant line instead.

      3
      • 1
        I fail to see the fundamental difference between your loop at the end of the answer and the new ArrayList<T>(Arrays.asList(myArray)); part which you discourage to use. Both do quite the same and have the same complexity.
        – glglgl
        CommentedFeb 22, 2015 at 17:03
      • The Collections one create a pointer at the beginning of the array. My loop create many pointers : one for each array member. So if the original array changes, my poiners are still directed toward the former values.CommentedFeb 22, 2015 at 19:59
      • 1
        new ArrayList<T>(Arrays.asList(myArray)); does the same, it copies the asList to an ArrayList...
        – glglgl
        CommentedFeb 22, 2015 at 21:56
      42

      In Java 9 you can use:

      List<String> list = List.of("Hello", "World", "from", "Java"); List<Integer> list = List.of(1, 2, 3, 4, 5); 
      1
      • Note that this is not an ArrayList, as it was explicitely asked.CommentedAug 3, 2018 at 20:57
      37

      According with the question the answer using java 1.7 is:

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

      However it's better always use the interface:

      List<Element> arraylist = Arrays.<Element>asList(array); 
      0
        34
        // Guava import com.google.common.collect.ListsLists ... List<String> list = Lists.newArrayList(aStringArray); 
          28

          Since Java 8 there is an easier way to transform:

          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()); } 
          1
          • I don't see how this is easier than: new ArrayList<>(Arrays.asList(array)); It's also unclear that it is more efficient in any way..
            – AminM
            CommentedAug 10, 2023 at 15:57
          27

          You can convert using different methods

          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));

          For more detail you can refer to http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html

            26

            as all said this will do so

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

            and the common newest way to create array is observableArrays

            ObservableList: A list that allows listeners to track changes when they occur.

            for Java SE you can try

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

            that is according to Oracle Docs

            observableArrayList() Creates a new empty observable list that is backed by an arraylist. observableArrayList(E... items) Creates a new observable array list with items added to it.

            Update Java 9

            also in Java 9 it's a little bit easy:

            List<String> list = List.of("element 1", "element 2", "element 3"); 
              24

              You also can do it with stream in Java 8.

              List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 
              1
              • 3
                As of java 8, Collectors.toList() will return an ArrayList. However this may differ in future versions on java.If you want a specific type of collection then use Collectors.toCollection() instead where you can specify which exact type of collection you would want to create.CommentedFeb 4, 2019 at 11:08
              18
              1. If we see the definition of Arrays.asList() method you will get something like this:

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

                So, you might initialize arraylist like this:

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

                Note : each new Element(int args) will be treated as Individual Object and can be passed as a var-args.

              2. There might be another answer for this question too.
                If you see declaration for java.util.Collections.addAll() method you will get something like this:

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

                So, this code is also useful to do so

                Collections.addAll(arraylist, array); 
              0
                14

                If the array is of a primitive type, the given answers won't work. But since Java 8 you can use:

                int[] array = new int[5]; Arrays.stream(array).boxed().collect(Collectors.toList()); 
                1
                • this solution doesn't seem to work with char array, either.CommentedJun 10, 2018 at 19:55
                12

                Another simple way is to add all elements from the array to a new ArrayList using a for-each loop.

                ArrayList<Element> list = new ArrayList<>(); for(Element e : array) list.add(e); 
                  10

                  We can easily convert an array to ArrayList. We use Collection interface's addAll() method for the purpose of copying content from one list to another.

                  Arraylist arr = new Arraylist(); arr.addAll(Arrays.asList(asset)); 
                  2
                  • This is less efficient than the accepted 9 year old answer.CommentedJul 10, 2017 at 10:06
                  • 3
                    One of ArrayLists constructors accepts a ? extends Collection<T> argument, making the call to addAll redundant.CommentedOct 6, 2017 at 20:26
                  9

                  Even though there are many perfectly written answers to this question, I will add my inputs.

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

                  New ArrayList can be created in the following ways

                  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); 

                  And they very well support all operations of 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 

                  But the following operations returns just a List view of an ArrayList and not actual 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)); 

                  Therefore, they will give error when trying to make some ArrayList operations

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

                  More on List representation of array link.

                    9

                    Simplest way to do so is by adding following code. Tried and Tested.

                    String[] Array1={"one","two","three"}; ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1)); 
                      9

                      Another Java8 solution (I may have missed the answer among the large set. If so, my apologies). This creates an ArrayList (as opposed to a List) i.e. one can delete elements

                      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); } } 

                      Output is...
                      Hello
                      world

                        9

                        You can do it in java 8 as follows

                        ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList()); 
                        2
                        • 2
                          Downvoted because that cast looks very dangerous. nothing specifies that the type of list that is returned is actually an ArrayList, as the javadoc states: "There are no guarantees on the type, mutability, serializability, or thread-safety of the List returned"CommentedJul 3, 2018 at 17:45
                        • 1
                          If you want to explicitely create an ArrayList, try this: ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));CommentedAug 3, 2018 at 20:53
                        9

                        Given Object Array:

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

                        Convert Array to List:

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

                        Convert Array to ArrayList

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

                        Convert Array to LinkedList

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

                        Print List:

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

                        OUTPUT

                        1

                        2

                        3

                          8

                          Use the following code to convert an element array into an 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]); } 
                            6

                            Already everyone has provided enough good answer for your problem. Now from the all suggestions, you need to decided which will fit your requirement. There are two types of collection which you need to know. One is unmodified collection and other one collection which will allow you to modify the object later.

                            So, Here I will give short example for two use cases.

                            • Immutable collection creation :: When you don't want to modify the collection object after creation

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

                            • Mutable collection creation :: When you may want to modify the created collection object after creation.

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

                            2
                            • List<Element> elementList = Arrays.asList(array) creates a wrapper over the original array which makes original array available as List. Hence a wrapper object is created, nothing gets copied from the original array. Therefore, operations like add or remove elements are not allowed.
                              – Priyanka
                              CommentedSep 9, 2017 at 8:57
                            • 4
                              Note that your "immutable collection" is not really immutable - the List returned by Arrays.asList is just a wrapper over the original array, and allows individual items to be accessed and modified via get and set. You should probably clarify that you mean "not add or remove elements" instead of "immutable", which means to not change at all.CommentedOct 6, 2017 at 20:24
                            6

                            Java 8’s Arrays class provides a stream() method which has overloaded versions accepting both primitive arrays and Object arrays.

                            /**** 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()); 
                              6

                              You could also use polymorphism to declare the ArrayList while calling the Arrays-interface as following:

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

                              Example:

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

                              This should work like a charm.

                                Start asking to get answers

                                Find the answer to your question by asking.

                                Ask question

                                Explore related questions

                                See similar questions with these tags.