Изменение размера ArrayList - PullRequest
4 голосов
/ 19 марта 2012

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

List<String> list = null;
int size = getSize(); // gets the exact number of elements I want

list = new ArrayList<String> (size);

for (int i = 0; i < size; i++) {
    list.add("String num: " + i);
}

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

Ответы [ 4 ]

15 голосов
/ 19 марта 2012
list = new ArrayList<String> (size);

Это создаст массив с начальным размером 'size'.Пока вы не добавите больше элементов, чем «размер», изменение размера не будет.

Также убедитесь, что это действительно требует времени в вашем приложении.Если вы не профилировали и не определили это как проблему, вы не выиграете много путем случайной оптимизации кода.

5 голосов
/ 19 марта 2012

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

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

2 голосов
/ 02 мая 2013

Чтобы ограничить ArrayList, вы могли бы переопределить метод ensureCapacity(int minCapacity), как в следующем примере:

public static class MyArrayList<T> extends ArrayList<T> {

    @Override
    public void ensureCapacity(int minCapacity) {
        if (minCapacity > 10) {
            throw new IllegalArgumentException();
        }
        super.ensureCapacity(minCapacity);
    }

}

Небольшой тест можно выполнить с помощью следующего кода:

public static void main(String[] args) {
    MyArrayList<String> items = new MyArrayList<String>();

    for (int i = 0; i < 15; i++) {
        try {
            items.add("itm " + i);
            System.out.println("succeeded to insert " + i);
        } catch (IllegalArgumentException e) {
            System.out.println("not able to insert " + i);
        }
    }

    System.out.println("items are: " + items);
}

Это напечатает:

succeeded to insert 0
succeeded to insert 1
succeeded to insert 2
succeeded to insert 3
succeeded to insert 4
succeeded to insert 5
succeeded to insert 6
succeeded to insert 7
succeeded to insert 8
succeeded to insert 9
not able to insert 10
not able to insert 11
not able to insert 12
not able to insert 13
not able to insert 14
items are: [itm 0, itm 1, itm 2, itm 3, itm 4, itm 5, itm 6, itm 7, itm 8, itm 9]
2 голосов
/ 19 марта 2012

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

String[] strArray=new String[size];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...