Как получить емкость ArrayList в Java? - PullRequest
16 голосов
/ 23 марта 2010

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

Thx

Ответы [ 9 ]

16 голосов
/ 23 марта 2010

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

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

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

9 голосов
/ 23 марта 2010

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

2 голосов
/ 23 марта 2010

Глядя на Спецификация ArrayList Я не вижу метода, который предоставляет эту информацию.

Тем не менее, метод sureCapacity выглядит как шаг в правильном направлении (предупреждение: это не гарантирует правильного ответа ): при вызове он гарантирует, что емкость по крайней мере, указанный аргумент. Таким образом, если реализация 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(); }

}
1 голос
/ 08 октября 2017

Вы можете получить текущую емкость ArrayList в Java, используя отражение . Вот пример:

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

Примечания:

  1. getCapacity() метод изменен с оригинала на http://javaonlineguide.net/2015/08/find-capacity-of-an-arraylist-in-java-size-vs-capacity-in-java-list-example.html
  2. Обратите внимание, что емкость по умолчанию 10 предоставляется после первого добавления в список. Если вы попробуете это перед добавлением, вы получите вывод 0
  3. Чтобы принудительно заполнить емкость без добавления, передайте ее в конструкторе следующим образом:

    List<Integer> numbers = new ArrayList<>(20);
    
0 голосов
/ 30 июля 2017

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

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

0 голосов
/ 20 октября 2015

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

новая емкость = (текущая емкость * 3/2) + 1.

0 голосов
/ 30 июля 2013

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

0 голосов
/ 23 марта 2010

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

0 голосов
/ 23 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...