如何在 Vector 中更改 "capacityIncrement" 值 post 初始化?
How to change "capacityIncrement" value post initialization in Vector?
In vector 默认情况下 initialCapacity
设置为 10
,capacityIncrement
也设置为 10
。
因此如果我们这样做 -
Vector<String> vector = new Vector<>();
我们将 initialCapacity
和 capacityIncrement
都设置为 10
。
但是,我们可以灵活地设置自己的值。
例如,如果我们这样做 -
Vector<String> vector = new Vector<>(5,5);
我们将 initialCapacity
和 capacityIncrement
都设置为 5
。
现在,post 初始化,我们有方法 -
void setSize(int size)
void ensureCapacity(int capacity)
void trimToSize()
根据我们的需要更改 size
和 capacity
。
但是,我们如何根据需要更改 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 更清洁而不需要它。
In vector 默认情况下 initialCapacity
设置为 10
,capacityIncrement
也设置为 10
。
因此如果我们这样做 -
Vector<String> vector = new Vector<>();
我们将 initialCapacity
和 capacityIncrement
都设置为 10
。
但是,我们可以灵活地设置自己的值。
例如,如果我们这样做 -
Vector<String> vector = new Vector<>(5,5);
我们将 initialCapacity
和 capacityIncrement
都设置为 5
。
现在,post 初始化,我们有方法 -
void setSize(int size)
void ensureCapacity(int capacity)
void trimToSize()
根据我们的需要更改 size
和 capacity
。
但是,我们如何根据需要更改 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 更清洁而不需要它。