(Nous allons construire sur SOI Plate-forme de 6)
Tout dépend de la perception effective de la mise en œuvre. Dans votre exemple, nous avons
Collection<Integer> col = new ArrayList<Integer>();
et addAll
méthode de ArrayList
est surchargé. Pas d'itérations que ce soit.
Voici le code source:
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacity(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
Comme vous pouvez le remarquer c.toArray()
dépend également de la mise en œuvre effective. Encore une fois, dans votre cas Arrays.asList()
résultats en ArrayList
laquelle est la version de toArray()
méthode ressemble à ceci:
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
Cette méthode statique est basée sur System.arraycopy
Donc en fait ce que nous traitons ici est de deux appels d' System.arraycopy
ce qui n'est pas mal fait parce que c'est une méthode native, spécialement optimisé pour le fonctionnement actuel du système.
Donc, pour résumer le tout dans M. polygenelubricants style:
- varags + l'autoboxing crée
Integer[]
-
Arrays.asList
crée un ArrayList<Integer>
-
ArrayList.addAll
des appels System.arraycopy(size)
x2, taille = 5
Dans votre cas, de 5 objets dans le tableau Collections.addAll
est de cource plus rapide. MAIS hors de propos avec une telle petite taille de la matrice. D'autre part, si c'était, disons, 100 k éléments dans un tableau alors col.addAll(Arrays.asList(...))
est beaucoup plus efficace, cause auprès méthode native c'est un seul memcpy/memmove-nous concernés par opposition à 100k itérations/les opérations de copie.
Et encore une fois, tout dépend de la collection de la mise en œuvre. LinkedList
par exemple va se répéter sur elle comme cela a été prévu.