javavectorframeworkssizecapacity

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


In vector by default initialCapacity is set at 10 and capacityIncrement is also set at 10.

Thus if we do -

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

we have initialCapacity and capacityIncrement both set at 10.

However, we have the flexibility to set our own values.

For example, if we do -

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

we have initialCapacity and capacityIncrement both set at 5.

Now, post initialization, we have the methods -

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

to change both size and capacity as per our needs.

But, how can we change the capacityIncrement value post initialization as per our need?


Solution

  • You can do it using reflect.Field as below:

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