如何在 Vector 中更改 "capacityIncrement" 值 post 初始化?

How to change "capacityIncrement" value post initialization in Vector?

In vector 默认情况下 initialCapacity 设置为 10capacityIncrement 也设置为 10

因此如果我们这样做 -

Vector<String> vector = new Vector<>();

我们将 initialCapacitycapacityIncrement 都设置为 10

但是,我们可以灵活地设置自己的值。

例如,如果我们这样做 -

Vector<String> vector = new Vector<>(5,5);

我们将 initialCapacitycapacityIncrement 都设置为 5

现在,post 初始化,我们有方法 -

void setSize(int size)
void ensureCapacity(int capacity)
void trimToSize()

根据我们的需要更改 sizecapacity

但是,我们如何根据需要更改 capacityIncrement 值 post 初始化?

您可以使用 reflect.Field 进行操作,如下所示:

public static void main (String[] args){
    Vector<String> vector = new Vector<>(5, 5);
    System.out.println(getMyCapacityIncrement(vector));
    setMyCapacityIncrement(vector, 9);
    System.out.println(getMyCapacityIncrement(vector));
}
private static void setMyCapacityIncrement(Vector<String> myVector, int capacityIncrement){
    try {
        Field field = myVector.getClass().getDeclaredField("capacityIncrement");
        field.setAccessible(true);
        field.set(myVector, capacityIncrement);
        field.setAccessible(false);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }
}

private static int getMyCapacityIncrement(Vector<String> myVector) {
    try {
        Field field = myVector.getClass().getDeclaredField("capacityIncrement");
        field.setAccessible(true);
        return field.getInt(myVector);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
        return -1;
    }
}

为什么创建后需要修改容量增量?

如果您知道结果 List 的(近似)大小,您可以使用合适的容量创建它,并且默认增量调整得很好,请参阅 ArrayList Efficiency and size

ArrayList中不存在更改增量的方法的原因是因为它是不必要的。这种微调不是必需的(或者无论如何都可以通过 ensureCapacity() 实现),因此 API 更清洁而不需要它。