2013-07-29 2 views
1

Мне было интересно, когда я создаю ArrayList класса. Это как-то быстрее, если я объявляю это как # 2 против № 1, указав его начальный размер? Или я должен только дать конструктору начальный размер, если я точно знаю, сколько столбцов я ему добавлю?Объявление ArrayList

  1. List<Column> columns = new ArrayList<Column>();
  2. List<Column> columns = new ArrayList<Column>(10);
+0

просто подсказка, с java 7 на, вам не нужно писать тип с правой стороны. -> 'Список columns = new ArrayList ()' to 'List columns = new ArrayList <>()' – q99

ответ

5

Поскольку они стоят, есть нет разницы между двумя.

Параметр в конструкторе используется для указания начальной емкости List, которая по умолчанию равна 10.

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

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

3

по умолчанию он не выделяет 10 ссылочный так никакой разницы

Свидетель это от source

public ArrayList() { 
    this(10); 
} 

Его использование предсказать приблизительный номер, например, если вы думаете, что может потребоваться около 25 элементов, и вы думаете, что он может расти, а затем просто определить initialCapacity для 25, чтобы избежать копирования массива, которая является более дорогостоящей операцией

1

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

Нужно ли указывать только начальный размер конструктора, если я точно знаю, сколько столбцов я им добавлю?

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

Проверить ArrayList «ы код:

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

ensureCapacity является метод, который изменяется основной массив в списке, если это на самом деле„полный“:

public void ensureCapacity(int minCapacity) { 
    modCount++; 
    int oldCapacity = elementData.length; 
    if (minCapacity > oldCapacity) { 
     Object oldData[] = elementData; 
     int newCapacity = (oldCapacity * 3)/2 + 1; 
     if (newCapacity < minCapacity) 
      newCapacity = minCapacity; 
     // minCapacity is usually close to size, so this is a win: 
     elementData = Arrays.copyOf(elementData, newCapacity); 
    } 
} 

Установка начальной известной емкости предотвращает это изменение размеров. Тем не менее, если вы знаете, сколько элементов вы будете использовать, почему бы не массив?

+2

Наконец, это фактически отвечает на вопрос – chancea

0

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

В вашем примере используется 10 членов, которые, по-видимому, являются размером по умолчанию текущей реализации ArrayList. Однако, я полагаю, вы спрашиваете о более общем случае.

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