Возможный дубликат:
Как получить емкость ArrayList в Java?
Как найти емкость ArrayList
?
Возможный дубликат:
Как получить емкость ArrayList в Java?
Как найти емкость ArrayList
?
Мне любопытно, для чего вам это нужно? Вы должны знать, что емкость не является (как может показаться) верхним пределом того, сколько вы можете поместить в 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
Нет, ты не можешь! Java ArrayList не предоставляет способ доступа к его текущей емкости.
Вы можете построить ArrayList, указав начальную емкость, используя конструктор ArrayList (int initialCapacity) или увеличить емкость, вызвав protectCapacity().
ArrayList
- это абстракция для автоматически растущих элементов List
. Вам редко нужно знать его способность. Рассмотрим эффективное Java 2nd Edition, пункт 52: обратитесь к объектам по их интерфейсам. Насколько это практически возможно, вам все равно, если это ArrayList
или LinkedList
; это просто List
.
Тем не менее, эти методы могут вас заинтересовать:
ArrayList(int initialCapacity)
void ensureCapacity(int minCapacity)
ArrayList
, если это необходимо, чтобы гарантировать, что он может содержать по крайней мере количество элементов, заданных аргументом минимальной емкости.void trimToSize()
ArrayList
как текущий текущий список. Приложение может использовать эту операцию для сведения к минимуму хранения экземпляра ArrayList
.Вам не нужно беспокоиться о емкости, то есть о внутренней реализации. Если внутренний массив заполняется, он будет расширяться. Вы можете узнать, сколько элементов находится в вашем ArrayList с помощью метода size()
.
Из спецификации: "Емкость - это размер массива, используемого для хранения элементов в списке. Он всегда не меньше размера списка. Поскольку элементы добавляются в ArrayList, его емкость растет автоматически. Детали политики роста не указаны за пределами того факта, что добавление элемента имеет постоянную амортизированную стоимость времени."
Итак, нет способа рассказать, что такое текущая емкость, и как она растет.
Я собираюсь поднять тренд здесь... у пользователя есть вопрос, хотя и без контекста. Без контекста знание пропускной способности не требуется, поскольку массив поддержки будет расти для размещения...
Вы можете сделать следующее, чтобы точно знать, что такое емкость с вашим ArrayList. Побочным эффектом является массив подстановки, который будет обрезан до точного количества элементов в массиве:
ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());
Наслаждайтесь!
Нужно ли вам это во время выполнения или нормально ли выполнять тестирование? Если его тестирование вы обычно видите емкость, используя ваш любимый отладчик IDE. У меня нет точного числа, но, как правило, размер емкости увеличивается. Поэтому, если вы создадите arraylist с 10 элементами, java сделает его размером 17.
API не предоставляет его. Внутри емкость умножается на коэффициент, когда add (..) вызывается в полной мере. Однако спецификация Java ничего не говорит об этом постоянном... Реализация Sun использует коэффициент 1,5, поэтому у вас есть верхняя граница размера 1.5 *() для емкости.
Помните, что вы можете использовать trimToSize() для "компактного" списка и сделать емкость равной размеру().