ArrayList容量增加数量

时间:2018-04-19 06:30:22

标签: java arraylist

只是一个简单的问题。在将一个元素添加到容量之后,是否有人可以确认以下是否是ArrayList新大小的正确序列?我知道它增长了1.5倍,但源代码中的+ 1让我怀疑我的答案。它从10的容量开始,但我问的原因是因为我想在大小变得非常大时测试添加方法对链表的效率。我了解到,由于摊销分析,平均增加量是不变的,但我只想通过实际解决这个问题来确认。

10,15,23,35,53,80,121 .......

提前致谢!

3 个答案:

答案 0 :(得分:0)

据我所知

newCapacity = (oldCapacity * 3)/2 + 1

因此,如果您创建一个容量为10的arrayList,则下一个值为16.然后是25,38,依此类推。 我想是+1,当前容量是奇数。

答案 1 :(得分:0)

正如评论中指出的那样,Java没有为此指定任何行为:正是该API的实现决定了ActorRef的扩展如何工作。

但是如果你问的是OpenJDK实现的行为,那么找到答案的一个简单方法就是查看源代码。在这种情况下ArrayList.grow

ArrayList

因此逻辑实际上非常复杂,具体取决于数组的大小。但在最简单的情况下,如果旧容量为private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } ,则新容量为c

在旧版本中,它是c + c/2,但在最近的实施中发生了变化。

这表明它值得检查来源!

答案 2 :(得分:0)

我进行了测试,请检查以下来源:

import java.lang.reflect.Field;
import java.util.ArrayList;

public class MyArrayList<E> extends ArrayList<E> {
    private int capacity = 0;

    public MyArrayList() {
        super();
    }

    public MyArrayList(int capacity) {
        super(capacity);
    }


    public void printCapacity() {
        try {
            Field elementData = ArrayList.class.getDeclaredField("elementData");
            elementData.setAccessible(true);
            Object[] arr = (Object[]) elementData.get(this);
            if (arr.length != capacity) {
                capacity = arr.length;
                System.out.println("Capacity == " + arr.length);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public class ResizeDemo {
    public static void main(String[] args) {
        MyArrayList<Integer> myArrayList = new MyArrayList<>();
        for (int i = 0; i < 1002; i++) {
            myArrayList.add(i);
            myArrayList.printCapacity();
        }
    }
}

它打印:

Capacity == 10
Capacity == 15
Capacity == 22
Capacity == 33
Capacity == 49
Capacity == 73
Capacity == 109
Capacity == 163
Capacity == 244
Capacity == 366
Capacity == 549
Capacity == 823
Capacity == 1234