Подтвердить что ты не робот

Емкость ArrayList

Возможный дубликат:
Как получить емкость ArrayList в Java?

Как найти емкость ArrayList?

4b9b3361

Ответ 1

Мне любопытно, для чего вам это нужно? Вы должны знать, что емкость не является (как может показаться) верхним пределом того, сколько вы можете поместить в ArrayList. Это значение, представляющее, сколько данных вы можете поместить в список, не заставляя его перераспределять его внутренний массив. В принципе, понятие пропускной способности доступно только для того, чтобы вы слегка подстроили производительность.

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

Интерфейс, предоставляемый API для ArrayList, просто не поддерживает такой вариант использования. Существует много причин для этого. Одна из причин заключается в том, что вы не должны заботиться об этом. ArrayList следует рассматривать как неограниченный массив, который абстрагируется от деталей, таких как емкость.

Ближе всего вы можете контролировать пропускную способность через конструктор ArrayList(int initialCapacity), а два метода trimToSize() и ensureCapacity(int minCapacity).

Для удовольствия, однако, мне удалось решить его с помощью уродливого отражения-взлома (не используйте это):

import java.lang.reflect.Field;
import java.util.ArrayList;
public class Test {

    public static void main(String[] args) throws Exception {
        ArrayList<Integer> list = new ArrayList<Integer>(3);
        for (int i = 0; i < 17; i++) {
            list.add(i);
            System.out.format("Size: %2d, Capacity: %2d%n",
                              list.size(), getCapacity(list));
        }
    }

    static int getCapacity(ArrayList<?> l) throws Exception {
        Field dataField = ArrayList.class.getDeclaredField("elementData");
        dataField.setAccessible(true);
        return ((Object[]) dataField.get(l)).length;
    }
}

Вывод:

Size:  1, Capacity:  3
Size:  2, Capacity:  3
Size:  3, Capacity:  3
Size:  4, Capacity:  5
Size:  5, Capacity:  5
Size:  6, Capacity:  8
Size:  7, Capacity:  8
Size:  8, Capacity:  8
Size:  9, Capacity: 13
Size: 10, Capacity: 13
Size: 11, Capacity: 13
Size: 12, Capacity: 13
Size: 13, Capacity: 13
Size: 14, Capacity: 20
Size: 15, Capacity: 20
Size: 16, Capacity: 20
Size: 17, Capacity: 20

Ответ 2

Нет, ты не можешь! Java ArrayList не предоставляет способ доступа к его текущей емкости.

Вы можете построить ArrayList, указав начальную емкость, используя конструктор ArrayList (int initialCapacity) или увеличить емкость, вызвав protectCapacity().

Ответ 3

ArrayList - это абстракция для автоматически растущих элементов List. Вам редко нужно знать его способность. Рассмотрим эффективное Java 2nd Edition, пункт 52: обратитесь к объектам по их интерфейсам. Насколько это практически возможно, вам все равно, если это ArrayList или LinkedList; это просто List.

Тем не менее, эти методы могут вас заинтересовать:

  • ArrayList(int initialCapacity)
    • Создает пустой список с указанной начальной емкостью.
  • void ensureCapacity(int minCapacity)
    • Увеличивает емкость этого экземпляра ArrayList, если это необходимо, чтобы гарантировать, что он может содержать по крайней мере количество элементов, заданных аргументом минимальной емкости.
  • void trimToSize()
    • Обрезает емкость этого экземпляра ArrayList как текущий текущий список. Приложение может использовать эту операцию для сведения к минимуму хранения экземпляра ArrayList.

Ответ 4

Вам не нужно беспокоиться о емкости, то есть о внутренней реализации. Если внутренний массив заполняется, он будет расширяться. Вы можете узнать, сколько элементов находится в вашем ArrayList с помощью метода size().

Ответ 5

Из спецификации: "Емкость - это размер массива, используемого для хранения элементов в списке. Он всегда не меньше размера списка. Поскольку элементы добавляются в ArrayList, его емкость растет автоматически. Детали политики роста не указаны за пределами того факта, что добавление элемента имеет постоянную амортизированную стоимость времени."

Итак, нет способа рассказать, что такое текущая емкость, и как она растет.

Ответ 6

Я собираюсь поднять тренд здесь... у пользователя есть вопрос, хотя и без контекста. Без контекста знание пропускной способности не требуется, поскольку массив поддержки будет расти для размещения...

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

ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());

Наслаждайтесь!

Ответ 7

Нужно ли вам это во время выполнения или нормально ли выполнять тестирование? Если его тестирование вы обычно видите емкость, используя ваш любимый отладчик IDE. У меня нет точного числа, но, как правило, размер емкости увеличивается. Поэтому, если вы создадите arraylist с 10 элементами, java сделает его размером 17.

Ответ 8

API не предоставляет его. Внутри емкость умножается на коэффициент, когда add (..) вызывается в полной мере. Однако спецификация Java ничего не говорит об этом постоянном... Реализация Sun использует коэффициент 1,5, поэтому у вас есть верхняя граница размера 1.5 *() для емкости.

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