Vector() Vector(Collection<? extends E> c) Vector(int initialCapacity) Vector(int initialCapacity,int capacityIncrement)
但它们如何运作以及它们用于什么?我为什么要为矢量定义固定容量?即使我将初始容量设置为100,我也可以向向量添加101.项:
Vector<Object> test = new Vector<Object>(100); for (int i = 0; i < 100; i++) { test.add(new Object()); } test.add(new Object()); System.out.println(test.size()); System.out.println(test.capacity());
在上面的代码中,第二个sysout(test.capacity())写入200.为什么此向量中的容量为200?初始容量为100,我没有定义容量增量.
我真的想知道是否有使用这些建筑师的真实世界的例子?
一个熟悉的问题:
究竟是Vector.get(int position)和Vector.elementAt(int position)之间的区别?我读到在将Vector添加到Collection类之前定义了get方法,因此有必要在以后添加方法elementAt(int position).真的吗?或者还有其他差异吗?
解决方法
初始容量就是:Vector在施工时的容量.
Vector是一种动态可扩展的数据结构,它会根据需要重新分配其后备阵列.因此,没有最终容量,但您可以设置其初始值.
这是Vector
API的摘录:
Each vector tries to optimize storage management by maintaining a
capacity
and acapacityIncrement
. Thecapacity
is always at least as large as the vectorsize
; it is usually larger because as components are added to the vector,the vector’s storage increases in chunks the size ofcapacityIncrement
. An application can increase thecapacity
of a vector before inserting a large number of components; this reduces the amount of incremental reallocation.
注意施工后,也可以使用ensureCapacity
来达到同样的效果.
也可以看看
为什么这有关系?
比方说,例如,您要将100个元素插入到Vector中. nullary constructor设置Vector的初始容量为10,并且在增长时尺寸增加一倍.这意味着要容纳100个元素,它可以加倍到20,40,80,然后最后加160,然后才能适应所有100个元素.
请注意,执行了4个增量重新分配步骤,当它最终适合所有100个元素时,仅使用60%的实际容量.另一方面,在插入之前使用ensureCapacity(100)
(或使用适当的构造函数重载来实现相同的效果)将使该过程更有效,因为没有多余的未使用容量,并且该阵列仅需要重新分配一次.
请注意,渐近地,上述两个过程同样是最优的(O(N)时间和O(N)空间),但当然后者在空间和时间上都是对前者的恒定时间改进.
当然,如果设置ensureCapacity(10000000),并且只插入100个元素,那么你只能使用.001%的容量 – 真是浪费!因此,如果您提前知道要插入多少元素,则可以通过使用ensureCapacity使该过程更有效(通过常数因子),但无论如何,即使没有您的矢量,Vector仍然可以自己完成一个很好的工作.救命.
也可以看看
> Java Set Initial Capacity Best Practice
为什么加倍?
没有详细说明,这种增长倍增是几何扩展的一种形式,这使得Vector的每次操作能够进行恒定时间摊销分析.值得注意的是,ArrayList
是一个由数组支持的类似可扩展数据结构,甚至没有详细说明其增长政策,但OpenJDK version的增长因子为3/2.
请注意,Vector实际上允许您使用capacityIncrement
设置非几何增长因子.重要的是要意识到如果将capacityIncrement设置为一个小的非零值,实际上可以使Vector渐近地执行可怕的操作.例如,如果将其设置为1,则添加N个元素将是O(N ^ 2)操作!
ArrayList不允许您自定义其增长策略,因为您甚至不应该知道(也不关心,真的!).
也可以看看
>请参阅:几何扩展和摊销成本
杂
What about
elementAt
andget
?
As of the Java 2 platform v1.2,this class was retrofitted to implement the 070011 interface,making it a member of the 070012. Unlike the new collection implementations,
Vector
issynchronized
.
public E elementAt(int index)
: Returns the component at the specified index. This method is identical in functionality to theget(int)
method (which is part of theList
interface).
所以按照时间顺序,Vector有了elementAt,在它被改装以实现List之前,因此必须实现get.
请注意有关Vector正在同步的部分.如果您不需要此功能,ArrayList将是一个更好的选择,因为您不需要支付线程安全的成本.
也可以看看
> ArrayList vs. Vectors in Java if thread safety isn’t a concern