加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 什么是Vector容量的目的

发布时间:2020-12-15 02:48:40 所属栏目:Java 来源:网络整理
导读:Vector API定义了4种不同的构造函数: Vector()Vector(Collection? extends E c)Vector(int initialCapacity)Vector(int initialCapacity,int capacityIncrement) 但它们如何运作以及它们用于什么?我为什么要为矢量定义固定容量?即使我将初始容量设置为100
Vector API定义了4种不同的构造函数:
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 a capacityIncrement. The capacity is always at least as large as the vector size; it is usually larger because as components are added to the vector,the vector’s storage increases in chunks the size of capacityIncrement. An application can increase the capacity of a vector before inserting a large number of components; this reduces the amount of incremental reallocation.

注意施工后,也可以使用ensureCapacity来达到同样的效果.

也可以看看

> When you create a collection object (List,Set,etc),usually they take a parameter known as “initialCapacity”. What does this parameter mean and how is it used ?

为什么这有关系?

比方说,例如,您要将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不允许您自定义其增长策略,因为您甚至不应该知道(也不关心,真的!).

也可以看看

> Wikipedia: Dynamic array

>请参阅:几何扩展和摊销成本

What about elementAt and get?

直接从the documentation:

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 is synchronized.

public E elementAt(int index) : Returns the component at the specified index. This method is identical in functionality to the get(int) method (which is part of the List interface).

所以按照时间顺序,Vector有了elementAt,在它被改装以实现List之前,因此必须实现get.

请注意有关Vector正在同步的部分.如果您不需要此功能,ArrayList将是一个更好的选择,因为您不需要支付线程安全的成本.

也可以看看

> ArrayList vs. Vectors in Java if thread safety isn’t a concern

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读