Java – лучший способ реализовать массив объектов динамического размера

Я новичок в Java.

Я должен реализовать массив объектов, которые изменяются в размере во время выполнения.

Код, который я пишу, также будет перенесен на Android.

По вашему опыту, что лучший способ реализовать это?

Благодаря,
Дэн

Solutions Collecting From Web of "Java – лучший способ реализовать массив объектов динамического размера"

Java имеет неадекватные возможности шаблона. До тех пор, пока вы хотите массив объектов, ArrayList<T> хорош. Для примитивов это ужасно.

Предполагая, что у вас есть иерархия объектов, которые вы хотите добавить в список, ArrayList идеален:

 ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>(); vehicles.add(new Car(...)); vehicles.add(new Truck(...)); 

В приведенном выше примере я предполагаю, что Vehicle является базовым классом, а Car and Truck – подклассами.

С другой стороны, если вам нужен список чисел, Java очень неэффективен. Каждый объект является ссылкой (действительно 4-байтовый указатель) на 12-байтовый блок памяти, плюс то, что вы на самом деле используете. Поскольку ArrayList не может применяться к int, это означает, что создание списка чисел означает:

  1. Создание списка Integer, обертка объекта для int.
  2. Преобразование объектов каждый раз, когда вы вытаскиваете число. Это делается автоматически в эти дни, но это требует времени.
  3. Инициализация в 5 раз больше хранения по мере необходимости.

Итак, если вы манипулируете большими кусками примитивных данных (int, float, double), это может стоить вам при написании собственной версии ArrayList. Это особенно важно, когда данные большие, а платформа небольшая (например, портативный Android-плеер).

Сравните это:

 ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 1000000; i++) list.add(i): 

чтобы:

 public class IntArray { private int[] data; private int used; private void grow() { // implement code to make data double in size here... } public IntArray(int size) { data = new int[size]; used = 0; } public void add(int i) { if (i >= data.length) grow(); data[used++] = i; } } IntArray list2 = new IntArray(1000000); for (int i = 0; i < 1000000; i++) list2.add(i); 

В прошлый раз, когда я сравнивал это, оптимальное использование примитивного списка более чем в 10 раз быстрее, чем предполагаемое субоптимальное использование ArrayList. Чтобы быть более справедливым, предварительно назначьте arraylist правильного размера – он все еще медленнее.

LinkedList имеет смысл только в том случае, если вы вставляете в начало или середину списка. Если ваш список создается путем добавления в конец, ArrayList будет полностью доминировать над LinkedList. Поэтому для типичного списка объектов, которые вы создаете по порядку, ArrayList – это то, что вы ищете. Для большого списка примитивов, таких как int или double, напишите свой собственный список.

Вероятно, вас больше всего интересует ArrayList .

Я думаю, что даже в wikipedia есть информация об использовании общих списков в java: http://en.wikipedia.org/wiki/Generics_in_Java

Вы должны познакомиться со структурой коллекции в java. У вас есть такие вещи, как Set, List, Map, SortedSets и т. Д., Которые могут быть действительно полезными структурами данных.

Это зависит от того, для чего вы собираетесь его использовать.

Если у вас есть массив, который часто меняет размер, я бы рекомендовал использовать ArrayList или что-то еще из рамки коллекции (в зависимости от того, для чего вы собираетесь использовать его).

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

 Arrays.copyOf(array, newSize); 

Надеюсь, поможет! 🙂