from: http://stackoverflow.com/a/3343829/5032462
在stackoverflow上看到的一篇回答,老外真是太professional了,mark一下。最后的summary值得看一下。
The Java API docs say the following about Collections.addAll
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.
So if I understand correctly, a) is slower than b):
a)
Collection<Integer> col = new ArrayList<Integer>(); col.addAll(Arrays.asList(1, 2, 3, 4, 5));
b)
Collection<Integer> col = new ArrayList<Integer>(); // Collections.addAll(col, Arrays.asList(1, 2, 3, 4, 5)); <-- won't compile Collections.addAll(col, 1, 2, 3, 4, 5);
Let's take a closer look at the two of them:
// a) col.addAll(Arrays.asList(1, 2, 3, 4, 5));
Here's what happens:
- varags + autoboxing creates
Integer[]
Arrays.asList
creates aList<Integer>
backed by the arrayaddAll
iterates over aCollection<Integer>
usingIterator<Integer>
// b) Collections.addAll(col, 1, 2, 3, 4, 5);
Here's what happens:
- varargs + autoboxing creates
Integer[]
addAll
iterates over an array (instead of anIterable<Integer>
)
We can see now that b)
may be faster because:
Arrays.asList
call is skipped, i.e. no intermediaryList
is created.- Since the elements are given in an array (thanks to varargs mechanism), iterating over them may be faster than using
Iterator
.
That said, unless profiling shows otherwise, the difference isn't likely to be "significant". Do not optimize prematurely. While Java Collection Framework classes may be slower than arrays, they perform more than adequately for most applications.
API links
Collections.addAll(Collection<? super T> c, T... elements)
- varargs i.e. array-basedCollection.addAll(Collection<? extends E> c)
-Collection
-based
See also
- Java Language Guide/Autoboxing
- Java Language Guide/Varargs
- Effective Java 2nd Edition, Item 25: Prefer lists to arrays
Related questions
Summary
- If you're adding elements from an array, you can use
Collections.addAll(col, arr)
- Remember that varargs are also done using arrays
- If you're adding elements from a
Collection
, usecol.addAll(otherCol)
- Do NOT e.g.
Collections.addAll(col, otherCol.toArray())
- Such roundabout way is likely to be slower!
- Do NOT e.g.
- It's not that one is supremely faster than the other
- It's about skipping unnecessary steps given the current situation