2013-11-12 2 views
3

Для программирования на Android, если я создаю ArrayList в методе и знаю, насколько большой будет список, когда я верну его из метода, должен ли я указывать начальный размер списка, когда я его создаю?Нужно ли указывать начальный размер списков при программировании для Android?

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

Спасибо.

Редактировать

Я говорю о тех случаях, когда я делать знают, что окончательный размер списка будет (например, я создаю список объектов типа B из списка объекты типа A).

Edit 2

Существуют ли какие-либо показатели эффективности, связанные с этим?

+0

Если вы являетесь \ динамическим, то это может быть полезно. Но я думаю, что лучше не беспокоиться о повышении производительности с этими изменениями, если вы не видите реальной проблемы. – kosa

+0

Если вы знаете размер, нет НИКАКОЙ причины, почему вы не должны использовать его для создания экземпляра списка - это то, что конструктор, который имеет емкость, предназначен для ... – assylias

ответ

1

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

Если вы используете конструктор по умолчанию, начальный размер будет равен 0. Из Android documentation:

public ArrayList() Создает новый экземпляр ArrayList с нулевой начальной мощности.

И код:

public ArrayList() { 
    array = EmptyArray.OBJECT; 
} 

Итак, позже, когда вы добавляете элементы, внутренняя Object[] array будет изменен:

@Override public boolean add(E object) { 
    Object[] a = array; 
    int s = size; 
    if (s == a.length) { 
     Object[] newArray = new Object[s + 
       (s < (MIN_CAPACITY_INCREMENT/2) ? 
       MIN_CAPACITY_INCREMENT : s >> 1)]; 
     System.arraycopy(a, 0, newArray, 0, s); 
     array = a = newArray; 
    } 
    a[s] = object; 
    size = s + 1; 
    modCount++; 
    return true; 
} 

Here является код андроида ArrayList.

Итак, чтобы не тратить время на изменение размера, лучше указать начальный размер ArrayList.

0

ArrayList предназначен для автоматической настройки на основе его содержимого. Вы можете предварительно распределить память, но в конечном итоге она будет скорректирована в зависимости от того, как вы используете ArrayList. Не имеет значения, если вы создадите огромный список, который будет сохраняться некоторое время, поскольку Java использует сбор мусора для очистки кучи.

0

Если вы знаете размер списка или какую-либо коллекцию, гораздо более удобно указывать размер раньше времени. Причина в том, что для создания коллекции требуется цикл, в зависимости от реализации, возможно, может быть, меньше.

0

Я думаю, что то же самое стоит здесь, как и в любом другом приложении Java. Вы не должны заботиться об этих микро-оптимизации только в том случае, если это окажется узким местом. Структуры данных в ГФДЕ имеют разумные значения по умолчанию:

ArrayList() { 
    this(10); 
} 

Это значение по умолчанию для ArrayList.

Что вы должны обратить внимание на это пространство и время сложность ваших методов.

0

Да, ArrayList предназначен для работы с динамическими размерами, но если ранее вы знаете, сколько элементов будет иметь ваш список, это хорошая практика, начинающаяся с указанного размера, для других разработчиков проще читать код.

0

Так, по моему опыту, если вы не ожидаете проблемы масштабирования после развертывания (не совсем точно, что вы хотите использовать в своем списке, поэтому, чтобы быть в безопасности), нет никаких причин для указания размера. Я имею в виду, если ты знаешь УВЕРЕН, что это всегда будет 10, ну, тогда, во что бы то ни стало. Это будет здорово.

Теперь, что вы МОЖЕТЕ сделать, это вставить команды вставки в дешевый (рабочий) оператор IF, чтобы сделать некоторое управление памятью. Узнайте, какое устройство (и), на которое вы нацеливаетесь, и придумайте разумное пространство в памяти, которое вам удобно использовать для вашего приложения. Если инструкция insert перейдет по этому поводу, предложите пользователю возможность продолжить работу и рискнуть проблемами производительности, полностью отказаться от вставки или, возможно, начать удаление старых файлов.

Опять же, не зная вашей точной ситуации, вам сложно советовать, но в целом, если вы МОЖЕТЕ АБСОЛЮТНО СКАЗАТЬ, что список будет максимальным в 10, обязательно инициализируйте до 10. Но вы не собираетесь больно, если вы просто отпустите его.

0

Да, вы должны пройти способность к конструкторе в ArrayList в данном случае, вот почему:

Конструктор вы могли бы назвать это следующим образом:

public ArrayList(int initialCapacity) { 
    super(); 
    if (initialCapacity < 0) 
     throw new IllegalArgumentException("Illegal Capacity: "+ 
              initialCapacity); 
    this.elementData = new Object[initialCapacity]; 
} 

при пропускании initialCapacity вы» re установить размер массива, который поддерживает ArrayList.

Скажите, что вы собираетесь добавить в список, и этот элемент приведет к изменению размера списка. Вот ряд вызовов функций, которые будут иметь место:

public boolean add(E e) { 
    ensureCapacityInternal(size + 1); // Increments modCount!! 
    elementData[size++] = e; 
    return true; 
} 

private void ensureCapacityInternal(int minCapacity) { 
    if (elementData == EMPTY_ELEMENTDATA) { 
     minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); 
    } 

    ensureExplicitCapacity(minCapacity); 
} 

private void ensureExplicitCapacity(int minCapacity) { 
    modCount++; 

    // overflow-conscious code 
    if (minCapacity - elementData.length > 0) 
     grow(minCapacity); 
} 

private void grow(int minCapacity) { 
    // overflow-conscious code 
    int oldCapacity = elementData.length; 
    int newCapacity = oldCapacity + (oldCapacity >> 1); 
    if (newCapacity - minCapacity < 0) 
     newCapacity = minCapacity; 
    if (newCapacity - MAX_ARRAY_SIZE > 0) 
     newCapacity = hugeCapacity(minCapacity); 
    // minCapacity is usually close to size, so this is a win: 
    elementData = Arrays.copyOf(elementData, newCapacity); 
} 

В заключение, если вы знаете, окончательный размер, путем передачи его в конструктор, вы собираетесь, чтобы гарантировать, что массив никогда не должен быть повторно размер.

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

Смежные вопросы