Что потребляет меньше, чтобы использовать 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
,