Начальный размер для ArrayList - PullRequest
1 голос
/ 10 декабря 2010

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

В частности, я хочу, чтобы он начинался с начального размера (скажем, SIZE) и могчтобы установить элементы явно сразу,

например,

array[4] = "stuff";

может быть записано

array.set(4, "stuff");

Однако следующий код выдает исключение IndexOutOfBoundsException:

ArrayList<Object> array = new ArrayList<Object>(SIZE);
array.set(4, "stuff"); //wah wahhh

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

ArrayList<Object> array = new ArrayList<Object>(SIZE);

for(int i = 0; i < SIZE; i++) {
   array.add(null);
}

array.set(4, "stuff"); //hooray...

Единственная причина, которую я даже спрашиваю, состоит в том, что я делаю это в цикле, который потенциально может выполняться несколько раз (десятки тысяч).Учитывая, что поведение изменения размера ArrayList «не указано», я бы предпочел не тратить время на изменение размера себя или памяти на дополнительные, неиспользуемые места в массиве, который его поддерживает.Однако это может быть спорным вопросом, поскольку я буду заполнять массив (почти всегда каждую ячейку в массиве) полностью вызовами array.set (), и никогда не превысит емкость?

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

Ответы [ 4 ]

7 голосов
/ 10 декабря 2010

Начальная емкость означает, насколько большой массив.Это не значит, что там есть элементы.Таким образом, размер! = Емкость.

На самом деле, вы можете использовать массив, а затем использовать Arrays.asList(array) для получения коллекции.

3 голосов
/ 10 декабря 2010

Я рекомендую HashMap


HashMap hash = new HasMap();
hash.put(4,"Hi");

1 голос
/ 10 декабря 2010

Учитывая, что ваша главная мысль - память. Затем вы можете вручную сделать то, что делает Java Arraylist, но это не позволяет вам изменять размер так, как вы хотите. Таким образом, вы можете сделать следующее:

1) Create a vector.
2) If the vector is full, create a vector with the old vector size + as much you want.
3) Copy all items from the old vector to your new vector.

This way, you will not waste memory.

Или вы можете реализовать структуру List (не vector). Я думаю, что у Java уже есть один.

0 голосов
/ 10 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...