Ryan is a Java developer working in software engineering research. His research mainly focuses on source code analysis and development tools. Ryan has posted 24 posts at DZone. You can read more from them at their website. View Full User Profile

How to Convert Array to ArrayList in Java?

04.23.2013
| 19468 views |
  • submit to reddit

This is a question that I wanted to take a look at for myself, because it is one of the top viewed and voted questions in stackoverflow.

The question asks how to convert the following array to an ArrayList.

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

1. Most popular and accepted answer

The most popular and the accepted answer is the following:

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

First, let’s take a look at the Java Doc for the constructor method of ArrayList.

ArrayList
- ArrayList(Collection c)
Constructs a list containing the elements of the specified collection, in the order they are returned by the collection’s iterator.

So what the constructor does is the following:
1. Convert the collection c to an array
2. Copy the array to ArrayList’s own back array called “elementData”

If the add() method is invoked now, the elementData array will be copied to a new larger array. As from the code below, the size grows 1.5 times of old size.

public void ensureCapacity(int minCapacity) {
      modCount++;
      int oldCapacity = elementData.length;
      if (minCapacity > oldCapacity) {
          Object oldData[] = elementData;
          int newCapacity = (oldCapacity * 3)/2 + 1;
          if (newCapacity < minCapacity)
              newCapacity = minCapacity;
             // minCapacity is usually close to size, so this is a win:
             elementData = Arrays.copyOf(elementData, newCapacity);
         }
}

2. Next popular answer

The next popular answer is:

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

It is not the best, because the size of the list returned from asList() is fixed. We know ArrayList is essentially implemented as an array, and the list returned from asList() is a fixed-size list backed by the original array. In this way, if add or remove elements from the returned list, an UnsupportedOperationException will be thrown.

list.add(new Element(4));
Exception in thread “main” java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at collection.ConvertArray.main(ConvertArray.java:22)

3. Indications of the question

Every Java programmer knows ArrayList, it is simple but easy to make such a mistake. I guess that is why this question is so popular. If a similar question asked about a Java library in a specific domain, it would be less likely to become so popular.

There are several answers that basically indicate the same solution. This is true for a lot of questions, I guess people just don’t care, they like talking!

Reference: stackoverflow question

 

Published at DZone with permission of its author, Ryan Wang. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Philippe Lhoste replied on Mon, 2013/05/27 - 6:42am

2. isn't the best, but is still a good answer if you have an array and the API requires to give or return an array list as a read-only object. In this case (particularly for a library), it might be better to return an immutable list (eg. with Guava) but for internal purposes, it is a quick and painless solution. 

As long as people are aware of its limitations!

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.