Известно, что Java ArrayList реализуется с использованием массивов и инициализирует с емкостью 10 и увеличивает его размер на 50%. Как получить текущую емкость ArrayList не Размер ArrayList.
спасибо
Известно, что Java ArrayList реализуется с использованием массивов и инициализирует с емкостью 10 и увеличивает его размер на 50%. Как получить текущую емкость ArrayList не Размер ArrayList.
спасибо
Я не думаю, что это возможно. Каков ваш прецедент? Я считаю, что С# ArrayLists имеет свойство .capacity, но класс Java ArrayList не раскрывает эту информацию.
У вас есть конструктор, который принимает аргумент начальной емкости, и у вас есть метод securityCapacity(), который вы можете использовать, чтобы уменьшить количество инкрементного перераспределения.
У вас также есть метод trimToSize(), который вы можете использовать, если вас действительно беспокоит использование памяти.
Вы можете получить это путем отражения:
public abstract class ArrayListHelper {
static final Field field;
static {
try {
field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
@SuppressWarnings("unchecked")
public static <E> int getArrayListCapacity(ArrayList<E> arrayList) {
try {
final E[] elementData = (E[]) field.get(arrayList);
return elementData.length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Глядя на Спецификация ArrayList Я не вижу метода, который предоставляет эту информацию.
Тем не менее, метод ensureCapacity выглядит как шаг в правильном направлении (осторожность: это не гарантирует правильность ответ): при вызове он гарантирует, что емкость не меньше указанного аргумента. Таким образом, если реализация ArrayList
использует этот метод для обеспечения емкости (в отличие от вызова частного метода/манипулирования соответствующими полями напрямую), вы можете получить текущую емкость, переопределив этот метод. Вам также необходимо переопределить trimToSize()
аналогичным образом.
Конечно, это решение не очень переносимо, поскольку другая реализация ArrayList
(на JVM у другого поставщика) может делать что-то по-другому.
Вот как код должен выглядеть как
public class CapacityTrackingArrayList<T> extends ArrayList<T> {
// declare a constructor for each ArrayList constructor ...
// Now, capacity tracking stuff:
private int currentCapacity = 10;
public int getCapacity() { return currentCapacity; }
public void ensureCapacity(int arg) {
currentCapacity = arg;
super.ensureCapacity(arg);
}
public void trimToSize() { currentCapacity = size(); super.trimToSize(); }
}
Не помните, если он есть, но вы можете сделать это сами, посмотрев исходный код ArrayList. Разработчики Java должны использовать исходный код в комплекте с SDK.
Я только что проверил документацию на солнце в классе ArrayList, и единственный метод, который я видел, связанный с емкостью, был обеспечен. Capability (int minCapacity), что не совсем то, что вы хотите. Удачи!
Вы можете использовать Vector вместо ArrayList. Вектор поддерживает метод capacity().
Значение по умолчанию ArrayList
равно 10. Если максимальный размер достигнут, новая емкость будет:
new capacity = (currentcapacity * 3/2) +1.
Весь смысл использования ArrayList заключается в динамическом добавлении нового элемента. Поэтому нет специального метода для получения возможности массива ArrayList.
Каждый раз, когда мы добавляем элемент динамически, возникает перераспределение, и поскольку перераспределение является дорогостоящим с точки зрения времени, предотвращение перераспределения повышает производительность и, следовательно, вы можете вручную увеличить емкость ArrayList, вызвав securityCapacity(), но опять же вы не сможете узнать емкость из ArrayList.
Этот код использует отражение для получения возможности массива ArrayList:
package examples1;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Field;
public class Numbers {
public static void main(String[] args) throws Exception {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
System.out.println(getCapacity(numbers));
}
static int getCapacity(List al) throws Exception {
Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
return ((Object[]) field.get(al)).length;
}
}
Это выведет: 10
Примечания:
getCapacity()
, измененный с оригинала на http://javaonlineguide.net/2015/08/find-capacity-of-an-arraylist-in-java-size-vs-capacity-in-java-list-example.html0
Чтобы заставить емкость без добавления, передайте ее в конструкторе так:
List<Integer> numbers = new ArrayList<>(20);