Когда и почему я должен использовать System.arraycopy (или: массивы против коллекций) - PullRequest
2 голосов
/ 17 декабря 2009

В ответах здесь в последнее время я нашел несколько разных привычек (или вкусов). Поэтому мне интересно, когда и почему использование Java System.arraycopy(...) предпочтительнее, чем Collection.addAll(...)? Когда нет?

Редактировать: Это сводится к массивам против коллекций. Пока спасибо. Но что может быть более эффективно обработано компьютером или ... ну ... лучше для программистов?

Спасибо
Майк
[; -)

Ответы [ 6 ]

4 голосов
/ 17 декабря 2009

Ну, во-первых, System.arraycopy(...) работает с массивами, а Collection.addAll() с коллекциями - поэтому то, что вы можете использовать, зависит от того, с какими объектами вы должны работать.

Альтернативой System.arraycopy(...) с массивами является написание цикла и копирование элементов вручную. Это

  • Еще код
  • Таким образом, более вероятно, содержит ошибку
  • В большинстве случаев медленнее, потому что System.arraycopy(...) - это собственный метод, который может использовать процедуры быстрого копирования памяти, предоставляемые ОС.
2 голосов
/ 17 декабря 2009

Ваше сравнение не имеет большого смысла ... Массивы не являются коллекциями. System.arraycopy - это очень быстрый native метод для копирования массивов. Вот почему люди и сам Java-фреймворк используют его.

2 голосов
/ 17 декабря 2009

Массивы не Collection с. Поэтому, когда вам нужно скопировать данные из массива в другой, используйте System.arraycopy. Если вам нужно добавить вещи из одного Collection в другой Collection, используйте Collection.add() или Collection.addAll().

1 голос
/ 17 декабря 2009

ИМХО Я бы порекомендовал использовать коллекции в большинстве случаев. Особенно в интерфейсах и публичных методах.

Например, если вы можете выбрать между:

public List<Integer> getFoo();
public int[] getFoo();

Первый метод дает вам возможность изменить реализацию ArrayList против LinkedList и т. Д. Или вернуть неизменяемую версию через Collections.unmodifiableList().

Если вы возвращаете массив в методе интерфейса, вам может потребоваться сделать защитную копию перед его возвратом, поскольку вы не можете помешать клиенту изменить содержимое массива. Кроме того, списки имеют лишь несколько недостатков по сравнению с массивами, почти всегда можно заменить массив на ArrayList, например.

Место, где по-прежнему имеют смысл массивы, - это методы varargs или алгоритмический код, где важны выигрыш в скорости таких операций, как clone и System.arraycopy.

0 голосов
/ 05 декабря 2013

Массив не является коллекцией. вот почему мы используем Sysytem.arrcopy, его собственный метод для копирования массива, но он очень быстрый

0 голосов
/ 26 октября 2012

Я хотел бы прокомментировать ответ с самым высоким рейтингом, но я думаю, у StackOverflow есть свои причины. Добавить:

Использование System.arraycopy () позволяет ОС создавать массив Copy-On-Write. Если вы никогда не меняете данные во втором массиве, их память никогда не выделяется.

Я знаю, что они говорят, чтобы избежать «ответа на ответ», но достаточно важно знать, что CoW может произойти. CoW позволяет создавать копии практически мгновенно и экономить память. Это потому, что до тех пор, пока не произойдет изменение в одной из копий, второй массив никогда не будет выделен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...