提问者:小点点

如何在 Vector 中初始化后更改“容量增量”值?


在矢量中,默认情况下< code>initialCapacity设置为< code>10,并且< code>capacityIncrement也设置为< code>10。

因此,如果我们这样做-

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

我们将initialCapacitycapacityIncrement都设置为10

然而,我们可以灵活地设定自己的价值观。

例如,如果我们做了-

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

我们将初始容量和容量增量都设置为 5

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

< code > void setSize(int size) < br > < code > void ensureCapacity(int capacity) < br > < code > void trim tosize()

根据我们的需要改变< code >尺寸和< code >容量。

但是,我们如何根据需要在初始化后更改容量增量值?


共2个答案

匿名用户

你可以用反射来做。字段如下:

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效率和大小。

ArrayList中不存在更改增量的方法的原因是因为它是不必要的。这种微调整不是必需的(或者无论如何可以通过ensureSpace()来实现),因此它使API更干净,没有它。