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

Как получить емкость ArrayList в Java?

Известно, что Java ArrayList реализуется с использованием массивов и инициализирует с емкостью 10 и увеличивает его размер на 50%. Как получить текущую емкость ArrayList не Размер ArrayList.

спасибо

4b9b3361

Ответ 1

Я не думаю, что это возможно. Каков ваш прецедент? Я считаю, что С# ArrayLists имеет свойство .capacity, но класс Java ArrayList не раскрывает эту информацию.

У вас есть конструктор, который принимает аргумент начальной емкости, и у вас есть метод securityCapacity(), который вы можете использовать, чтобы уменьшить количество инкрементного перераспределения.

У вас также есть метод trimToSize(), который вы можете использовать, если вас действительно беспокоит использование памяти.

Ответ 2

Вы можете получить это путем отражения:

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);
        }

    }
}

Ответ 3

Глядя на Спецификация 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(); }

}

Ответ 4

Не помните, если он есть, но вы можете сделать это сами, посмотрев исходный код ArrayList. Разработчики Java должны использовать исходный код в комплекте с SDK.

Ответ 5

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

Ответ 6

Вы можете использовать Vector вместо ArrayList. Вектор поддерживает метод capacity().

Ответ 7

Значение по умолчанию ArrayList равно 10. Если максимальный размер достигнут, новая емкость будет:

new capacity = (currentcapacity * 3/2) +1.

Ответ 8

Весь смысл использования ArrayList заключается в динамическом добавлении нового элемента. Поэтому нет специального метода для получения возможности массива ArrayList.

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

Ответ 9

Этот код использует отражение для получения возможности массива 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.html
  • Обратите внимание, что после первого добавления в список предоставляется значение по умолчанию 10. Если вы попробуете это перед добавлением, вы получите вывод 0
  • Чтобы заставить емкость без добавления, передайте ее в конструкторе так:

    List<Integer> numbers = new ArrayList<>(20);