Java документы API говорит неотступно следование Collections.addAll
Поведение этого удобного метода идентично поведению c.addAll (Arrays.asList (элементы)), но этот метод, вероятно, будет работать значительно быстрее при большинстве реализаций.
Таким образом, если я понимаю правильно, a) медленнее, чем b):
a)
Collection col = new ArrayList();
col.addAll(Arrays.asList(1, 2, 3, 4, 5));
b)
Collection col = new ArrayList();
// Collections.addAll(col, Arrays.asList(1, 2, 3, 4, 5)); <-- won't compile
Collections.addAll(col, 1, 2, 3, 4, 5);
Кто-либо может объяснить мне, почему это?
отредактированный: исправленный пример кода. благодаря polygenelubricants
Давайте подробнее рассмотрим два из них:
// a) col.addAll (Arrays.asList (1, 2, 3, 4, 5));
Вот что происходит:
Integer []
Arrays.asList
создает List
, поддерживаемый массивом addAll
выполняет итерацию по Collection
, используя Iterator
// b) Коллекции.addAll (столбец, 1, 2, 3, 4, 5);
Вот что происходит:
Integer []
addAll
выполняет итерацию по массиву (вместо Iterable
) Мы теперь можно увидеть, что б)
может быть быстрее, потому что: вызов
Arrays.asList
пропускается, т.е. не создается промежуточный Список
. Iterator
. При этом, если профилирование не показывает иное, разница вряд ли будет «значительной». Не оптимизируйте преждевременно. Хотя классы Java Collection Framework могут быть медленнее, чем массивы, они работают более чем адекватно для большинства приложений.
Collections.addAll (Collection Super T> c, T ... elements)
- varargs, т.е. на основе массива Collection.addAll (Collection Extends E> c)
- На основе коллекции
Collections.addAll (col, arr)
Коллекции
, используйте col.addAll (otherCol)
Collections.addAll (col, otherCol.toArray ())
Единственная причина, по которой он может быть быстрее, состоит в том, что он избегает вызова Arrays.asList, который должен быть относительно дешевым, поскольку он просто обертывает массив.Некоторые реализации Collection, например LinkedList, преобразуют переданную коллекцию обратно в массив перед добавлением элементов, что вызывает дополнительные накладные расходы.
С другой стороны, ArrayList.addAll выделяет необходимое пространство один раз перед добавлением каких-либо элементов, и поэтому должно быть намного быстрее, когда Collections.addAll требует многократного изменения размера резервного массива.
Таким образом, Collections.addAll может быть быстрее при многократном добавлении всего нескольких элементов в коллекцию, но я сомневаюсь, что этот случай когда-либо станет узким местом для производительности.