Что потребляет меньше, чтобы использовать ArrayList или System.arraycopy

Может быть, очевидно, но я хочу знать, что и почему является наилучшей практикой при снижении потребления системных ресурсов.

Когда я хочу динамически расширить массив, я могу использовать либо

System.arraycopy(arraystuff, 0, tempArray, 0, arraystuff.length);

или же

ArrayList 

Проще всего конечно ArrayList но есть ли причина использовать arraycopy?

2 ответа

Решение

Почти всегда вы должны использовать абстракцию более высокого уровня. Вам часто не нужно заботиться об этом ArrayList внутренне изменяет свой размер или даже сохраняет данные в массиве (в большинстве случаев List ссылка, а не ArrayList); это "просто работает".

Тем не менее, стратегия изменения размера фиксируется с ArrayList: он всегда изменяет размер на множитель 1,5, чтобы амортизировать стоимость перераспределения массива по многим дополнениям. Это может привести к потере много места, если, скажем, вам нужно всего лишь добавить еще 1 элемент в полный список из 1 000 000 элементов.

Правда, вы можете использовать trimToSize чтобы избавиться от этого потраченного впустую пространства, но только после факта: вы бы тогда выделяли массив из 1,5M элементов и массив (1M+1)-элементов. Массив 1,5M-элементов будет выделяться только временно, а затем может быть GC'd, но это все же больше усилий, чем просто выделение массива (1M+1)-элементов напрямую.

В этом случае вы можете захотеть иметь что-то, что у вас будет больше контроля над тем, как оно изменяет размеры, и в этой ситуации, используя System.arraycopy может быть более подходящим.

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


Обратите внимание, что вы можете найти Arrays.copyOf легче работать с чем System.arraycopy в целях изменения размера массива, потому что он принимает меньше параметров и является типобезопасным. (Оно использует System.arraycopy внутри).

System.arraycopy() это родной метод в то время как ArrayList это реализация Java высокого уровня, которая в конечном итоге вызовет System.arraycopy(), Следовательно, с точки зрения производительности, System.arraycopy() определенно лучше Но в целом, если для вашего приложения не важен каждый бит производительности, обычно лучше использовать List,

Другие вопросы по тегам