`

此Vector非彼Vector

JDK 
阅读更多

        在学习STL的过程中,我发现了一个熟悉的面孔——Vector。之所以熟悉,是因为Vector是Java核心类库中的Collection container的一种,然而在我近一年的开发历程当中,我从来都没有使用过Vector,甚至对其几乎是一无所知,只是知道这是JDK中遗留的Collection container,而且在开发过程中也不提倡使用它。花心的我在看着STL的Vector的时候,心里还是惦记着我那可爱的Java情人[1]。于是,我翻出了JDK的document,翻出了Vector的source code,去看个究竟。
        噢,Vector原来就是动态数组啊,这不是跟STL中的Vector很类似吗?即使在Java核心类库当中,ArrayList不也是动态数组吗?而STL并没有跟ArrayList相match的东东啊(至少看字面上就没有)。那么在Java中Vector与ArrayList有什么区别呢?那么Java中的Vector与STL中Vector呢?
       在Java当中,Vector与ArrayList都是AbstractList派生的子类,在很多方面它们是很类似的:
       1、实现了动态增长的数组;
       2、通过对象数组(Object[])来实现数据的存储,因此它们都无法容纳原始类型(primitive type),如 int类型的数据;
       而它们的区别:
       1、正如JDK上所说的那样(This class is roughly equivalent to Vector, except that it is unsynchronized),主要在同步性上:Vector是同步的,而ArrayList是非同步的。由于实现同步,在效率上Vector要比ArrayList要低。
       2、除此之外,它们在数组的动态增长的策略上也是不同。往Vector增加一个元素的时候,如果Vector的容量(capacity)不足的时候,将会从新创建一个对象数组,请看下面来自 JDK的源代码:

private void ensureCapacityHelper(int minCapacity) {
 
int oldCapacity = elementData.length;
 
if (minCapacity > oldCapacity) {
     Object oldData[] 
= elementData;
     
int newCapacity = (capacityIncrement > 0?
  (oldCapacity 
+ capacityIncrement) : (oldCapacity * 2);
         
if (newCapacity < minCapacity) {
  newCapacity 
= minCapacity;
     }

     elementData 
= new Object[newCapacity];
     System.arraycopy(oldData, 
0, elementData, 0, elementCount);
 }

}

        这里得特别说一下,如果使用不带参数的构造函数( Vector() )去创建一个Vector实例的话,capacityIncrement的初始值为0,而capacity为10。   
        而ArrayList在遇到capacity不足的时候,所创建的对象数组的capacity为newCapacity = (oldCapacity * 3)/2 + 1。我不赞同一些人所说的保存大量数据时候,就应该使用Vector。诚然,由于Vector采取的数组动态增长的策略,使得新创建的对象数组相对较大,减少了分配内存和数组拷贝的次数,但是这样带来的副作用是造成了内存空间的浪费;同时,我觉得应该尽可能少用不带参数的构造方法,在构造实例的同时为Vector或者ArrayList赋予合适的capacity才是最好的解决办法。
        3、Vector提供了比ArrayList丰富得多的函数。如Vector提供了
              修改某个索引值对应元素的方法:setElementAt(Object, int);
              在某个索引值前插入元素的方法:insertElementAt(Object,int);
              返回capacity的方法:capacity();
              ……
        相比之下,也许是因为同步造成的问题吧,否则我怎么都想不明白为什么不提倡使用Vector。同时,在比较ArrayList和Vector过程中,我也越发觉得泛型的强大了,最明显的就是ArrayList和Vector都使用对象数组去存储数据,编译器就无法对其进行类型检查了。至于STL中的Vector与Java中的Vector有什么区别,下次再续了。

        [1] Summary of function parameter
 

分享到:
评论

相关推荐

    VectorCAST License安装手册.pdf

    VectorCAST License 安装手册 VectorCAST License 安装手册是 VectorCAST 软件的 License 管理工具安装指南,旨在帮助用户正确地安装和配置 VectorCAST License。下面是该手册中涉及到的知识点: 基本信息 * 软件...

    vector源代码下载

    - `grow()`:当`vector`需要扩大容量时,此函数负责增加容量并移动元素。 - `append_element(const T&)`:在`vector`末尾追加元素,可能触发容量增长。 通过这个自定义的`Vec`类,我们可以看到`vector`实现的核心...

    MFC的vector小例子

    在C++编程中,`std::vector`是一个非常重要的容器,它是STL(标准模板库)的一部分,由MFC(Microsoft Foundation Classes)框架所支持。`std::vector`是一个动态数组,可以方便地进行元素的添加、删除和访问。在这...

    Vector产品手册电子版

    Vector产品手册电子版 Vector产品手册电子版是Vector公司发布的一份产品手册,详细介绍了Vector公司的概况、产品及服务等信息。Vector公司是一家德国的汽车工业软件公司,成立于1988年,总部位于德国斯图加特。 ...

    Vector Cast使用手册

    《Vector Cast使用手册》 在软件开发过程中,测试是确保产品质量的重要环节。单元测试和集成测试作为两种关键的测试方法,对于发现代码中的错误和缺陷至关重要。Vector Cast是一款强大的自动化测试工具,它提供了...

    自己实现的vector

    在C++编程中,`std::vector`是一个非常重要的容器,它提供了动态数组的功能,允许我们在运行时方便地增加或减少元素数量。然而,对于学习和理解C++内存管理和容器实现原理,尝试自己编写一个类似`std::vector`的数据...

    纯c语言向量vector实现vector_master

    在C++中,`std::vector`是一种非常重要的容器,它提供了一种动态数组的概念,允许我们在运行时灵活地管理内存。然而,在某些只支持C语言的环境中,我们无法直接使用C++的`std::vector`。为了在这些场景下也能实现...

    VectorCAST.pdf

    1. VectorCAST工具介绍: - VectorCAST是一个嵌入式软件测试产品。 - 由Vector软件公司开发,这是一家位于美国的公司,成立于1990年,由嵌入式开发人员创立。 - VectorCAST的第一个产品是在1994年为洛克希德马丁...

    单元测试 Vector Cast Train资料

    1. **Vector Cast简介**:Vector Cast是一款强大的自动化单元测试工具,它提供了一整套完整的测试框架,包括测试生成、执行、结果分析和覆盖率报告等功能。该工具支持多种编译器和操作系统,适应不同开发环境。 2. ...

    Startup with Vector SLP4 User Manual---Vector Davinci官方帮助配置手册.pdf

    根据提供的文件信息,这是一本关于如何使用Vector ...由于手册内容详细,为简化内容表述,在此无法一一列举所有知识点,因此仅提供了主要的和结构性的部分内容概述。实际使用手册时,应详细阅读并理解所有条款和细节。

    Vector初始化的各种写法

    在编程领域,特别是Java或C++等语言中,向量(Vector)是一种常见的数据结构,用于存储动态大小的有序元素序列。这篇博客“Vector初始化的各种写法”可能探讨了如何在程序开始时设置和填充一个Vector对象的不同方法...

    Vector_FlashBootLoader功能以及产品.zip

    《Vector FlashBootloader功能及其产品概述》 在嵌入式系统开发中,Bootloader起着至关重要的作用,它是系统启动的第一步,负责加载操作系统或应用程序到内存中执行。Vector公司提供的Flash Bootloader(简称FBL)...

    vector详细用法

    ### Vector在C++中的详细用法 #### 一、Vector简介 Vector是C++标准模板库(STL)中的一个重要组成部分,它是一个动态数组容器,能够存放任意类型的元素,并且支持动态扩展和收缩。Vector之所以被称为容器,是因为...

    matlab 里面vector

    MATLAB 中的 Vector MATLAB 作为一款功能强大的数学软件,Vector 是其核心概念之一。Vector 是一个一维数组,可以存储数字、字符或逻辑值等类型的数据。在 MATLAB 中,Vector 可以用来表示矩阵、向量、数组等多种...

    C++ Vector使用方法

    C++中的`std::vector`是一个非常重要的标准模板库(STL)容器,它提供了一种动态数组的功能。在C++编程中,`vector`经常用于处理动态大小的序列数据,其内部存储空间是连续的,这使得随机访问元素非常高效。下面我们将...

    vector flash

    当设备启动时,首先运行的是存储在非易失性内存中的引导加载程序。该程序负责初始化必要的硬件资源,并准备接收来自外部的更新指令。一旦收到更新请求,它会验证新的固件映像是否完整无误,并将其写入到主应用区域。...

    vector1_STL_C++_vector_

    6. **其他方法**:`empty()`检查`vector`是否为空,`clear()`清空`vector`的所有元素,`swap(vector&lt;T&gt;& other)`交换两个`vector`的内容。 ### 效率考虑 虽然`vector`提供了许多便利,但在特定操作下,如在中间...

    XCP Basic Driver.rar_Xcp 标定_leathertjb_vector XCP_vector xcp bas

    此驱动可能是为了在VECTOR的环境下,使得用户能够方便地进行XCP协议的标定操作。 "XCP"和"vector_xcp"标签则直接指向了这个驱动与XCP协议和VECTOR工具的关系。XCP协议包括XCP on CAN和XCP on Ethernet两种形式,...

    C语言下的vector

    在C++标准库中,`std::vector`是一种动态数组,它允许我们在程序运行时方便地添加或删除元素。然而,在纯C语言环境下,我们没有内置的类似数据结构。为了在C语言中实现类似STL(Standard Template Library)的`...

    用vector写的学生管理系统

    《使用Vector实现学生管理系统》 在C++编程中,`std::vector` 是一个非常重要的容器,它在标准模板库(STL)中扮演着数组的角色,提供了动态数组的功能。本项目“用vector写的学生管理系统”是利用C++的vector容器...

Global site tag (gtag.js) - Google Analytics