2013-11-30 2 views
3

я пытался инициализировать ArrayList в конструкторе, и у меня есть что-то вроде этого:Java инициализации ArrayList в конструкторе или методе

public class A { 

private ArrayList<Items> _items = null; 
private ArrayList<Items> _collection = null; 

public A(int size1, int size2) { 
    this._items = new ArrayList<Items>(size1 * size2); 
} 

public void create(int size) { 
    this._collection = new ArrayList<Items>(size); 
} 

Но когда я пытался что-то добавить к ArrayList _items, я был получение ArrayIndexOutOfBoundsException. Не могли бы вы объяснить это, пожалуйста? Я искал его и добавил this._items вместо _items. Я думал, выходя из границ, но я пытался напечатать _items.size и получал 0 вместо size1 * size2 ...

Я оставил ArrayList = null, потому что размер зависит от size1/size2 наступающего из конструктора

+1

Вы можете написать код о том, как вы пытаетесь добавить в список? –

+0

'Но когда я попытался добавить что-то в _items ArrayList, я получал ArrayIndexOutOfBoundsException', вы могли бы показать нам, как вы пытаетесь добавить что-то в свой список? – Pshemo

+0

Как @Steve P. сказал, я добавлял с определенным индексом. Например: 'this._items.add (index, Item)' Так как в ArrayList ничего не было, размер был бы 0, и я получал ArrayIndexOutOfBoundsException. – msk

ответ

2

Вот источник от ArrayList:

конструктор:

public ArrayList(int initialCapacity) 
{ 
    super(); 

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

Вы назвали add(int, E):

public void add(int index, E element) { 
    rangeCheckForAdd(index); 
    ensureCapacity(size+1); // Increments modCount!! 
    System.arraycopy(elementData, index, elementData, index + 1, size - index); 
    elementData[index] = element; 
    size++; 
} 

add называет rangeCheckForAdd(int):

private void rangeCheckForAdd(int index) { 
    if (index > size || index < 0) 
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 
} 

Это может быть тонким, но когда вы назвали конструктор, несмотря на инициализацию Object[], вы не инициализировать size. Таким образом, из rangeCheckForAdd, вы получите IndexOutOfBoundsException, так size 0.

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

Вместо использования add(int, E) вы можете использовать add(E e), и этого не произойдет.

+0

Итак, как мне это сделать? 'это._items = new ArrayList (size1 * size2) '? – msk

+0

@msk Ваша инициализация в порядке. Вы не хотите использовать необработанный тип, как в комментарии, который вы только что сделали. Вы просто не можете использовать 'set()', если в этом месте уже нет элемента. Вы можете использовать метод 'add', как я предложил, т.е.' _items.add (myItem) '. –

+0

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

0

Для этого вам следует прочитать javadocs. размер не о том, «сколько может хранить список», а о том, «сколько объектов оно держит, когда размер был вызван».

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

Списки следуют простым философским операциям, добавляют объект, получают объект, удаляют объект и перебирают все объекты.

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