Vector容器详解

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Vector容器详解

概述


Vector是JDK 1.0中引入的一个集合,具有和ArrayList一样的功能, 但是在平时的开发过程中很少使用,我们可能仅限于知道它是一个线程安全的有序集合,那它为什么基本上被我们程序员淘汰了呢?


Vector介绍


Vector 是一个有序的集合容器,可以进行自动扩容,而且它是线程安全的。

1671176097674.jpg

以上是Vector的类图:

  • 继承了AbstractList,该类封装了List的基本操作
  • 实现了List接口,表明是一个有序列表
  • RandomAccess 是一个标记接口,用于标记实现该接口的集合支持快速随机访问。
  • Serializable 是一个标记接口,用于标记实现该接口的类可以序列化。
  • Cloneable 是一个标记接口,用于标记实现该接口的类可以调用 clone 方法,否则会抛异常。

构造方法:

  1. public Vector(int initialCapacity,int capacityIncrement)        

说明:Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。

public Vector(int initialCapacity)          

说明:构造函数只创建初始存储容量

public Vector()   

说明:既不指定初始的存储容量也不指定capacityIncrement,默认的初始容量是10

关键方法:

1671176105906.jpg

基本都是List接口的方法,用来操作集合数据,不做阐述。


核心机制


扩容机制


区别于ArrayList,每次扩容是当前容量的1.5倍,Vector是根据构造函数传入的capacityIncrement参数来确定每次增加的容量,如果传入的capacityIncrement为0或者不传入,每次扩容是当前容量的2倍。


FailFast机制


虽然Vector是一个线程安全的容器,但是它仅限于单个方法,比如add方法。

在Vector 是哦那个Iterator遍历的过程中,其他线程操作Vector,比如添加或者删除元素,都有可能导致迭代遍历出现未知的错误,这种快速失败做出响应,抛出ConcurrentModificationException异常就是fail fast。


源码解析


我们重点就关注下add方法,看下它是如何扩容的。

// synchronized关键字表明方法是同步的
public synchronized boolean add(E e) {
        // 容器修改次数++
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        // 设置元素最后的索引为当前元素
        elementData[elementCount++] = e;
        return true;
    }
// 确认容量的帮助方法
private void ensureCapacityHelper(int minCapacity) {
        // 如果元素数量大于数组的长度了,需要进行扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
// 扩容操作
private void grow(int minCapacity) {
        // 原来的容量
        int oldCapacity = elementData.length;
        // 新的容量=原来的容量 + 增加的容量, 这里增加的容量如果为0,则新的容量是原来的容量的2倍
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // 拷贝进行扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }


总结


回过头来,我们在想想为什么不推荐大家使用这个Vector容器了?

  1. 因为vector是线程安全的, 用synchronized关键字,所以效率低;
  2. Vector空间满了之后,默认情况下扩容是一倍,而ArrayList仅仅是一半;
  3. Vector分配内存的时候需要连续的存储空间,如果数据太多,容易分配内存失败;

至于线程安全的同类容器,我推荐可以用jdk1.5引入的CopyOnWriteArrayList

目录
相关文章
|
4月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
42 0
|
6月前
|
存储 算法 编译器
8.STL中Vector容器的常见操作(附习题)
8.STL中Vector容器的常见操作(附习题)
|
6月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
|
6月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
70 5
|
6月前
|
存储 算法 C++
【C++/STL】:vector容器的基本使用
【C++/STL】:vector容器的基本使用
42 1
|
5月前
|
存储 安全 C++
|
5月前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
6月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
265 0
|
6月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
51 0
|
6月前
|
存储 缓存 C++
Vector容器介绍
Vector容器介绍