Java Vector类应用场景

 更新时间:2025年07月08日 11:55:12   作者:程序员水自流  
Vector是Java线程安全的动态数组,支持动态扩容与随机访问,所有方法加锁确保并发安全,但性能较低,现代开发推荐用CopyOnWriteArrayList或手动同步的ArrayList替代,本文给大家介绍Java Vector类详解,感兴趣的朋友一起看看吧

Vector 是 Java 中的一个经典集合类,位于 java.util 包中。它是一个 动态数组,允许存储任意类型的对象,并支持动态调整大小。与 ArrayList 类似,但 Vector 的所有方法都是 线程安全的,适用于多线程环境。以下是 Vector 类的详细介绍:

一、Vector的核心特性

1. 动态数组

  • Vector 内部通过数组实现,支持动态扩容和缩容。
  • 当元素数量超过当前数组容量时,会自动扩容(默认扩容为当前容量的 2 倍)。
  • 支持随机访问(通过索引直接获取元素),实现 RandomAccess 接口。

2. 线程安全

  • 所有方法(如 addgetremove)都通过 synchronized 关键字修饰,确保多线程环境下的线程安全。
  • 同步锁粒度:对整个 Vector 对象加锁,可能导致性能开销较大。

3. 允许重复元素和null值

  • ArrayList 一样,Vector 允许存储重复元素和 null 值。

4. 序列化支持

  • 实现 Serializable 接口,支持对象序列化,可以通过流进行读写。

5. 实现的接口

  • List<E>:提供列表的基本操作(增删查改)。
  • RandomAccess:支持快速随机访问。
  • Cloneable:支持克隆操作。
  • Serializable:支持序列化。

二、Vector的构造函数

构造函数描述
Vector()创建一个空的 Vector,初始容量为 10
Vector(int initialCapacity)指定初始容量,无容量增量(capacityIncrement 为 0)。
Vector(int initialCapacity, int capacityIncrement)指定初始容量和容量增量。每次扩容时,容量增加 capacityIncrement 的值。若 capacityIncrement <= 0,则扩容为当前容量的 2 倍。
Vector(Collection<? extends E> c)使用指定集合初始化 Vector

示例代码

// 默认构造函数
Vector<String> vector1 = new Vector<>();
// 指定初始容量
Vector<String> vector2 = new Vector<>(20);
// 指定初始容量和容量增量
Vector<String> vector3 = new Vector<>(10, 5);
// 从集合初始化
Vector<String> vector4 = new Vector<>(Arrays.asList("A", "B", "C"));

三、Vector的常用方法

1. 添加元素

  • add(E e):将元素添加到 Vector 末尾。
  • addElement(E obj):与 add 功能相同(Vector 特有的方法)。
  • insertElementAt(E obj, int index):在指定位置插入元素。
Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.addElement("Banana");
vector.insertElementAt("Cherry", 1);
System.out.println(vector); // [Apple, Cherry, Banana]

2. 删除元素

  • remove(int index):删除指定位置的元素。
  • remove(Object o):删除第一次出现的指定元素。
  • removeElement(Object obj):与 remove(Object o) 功能相同。
  • removeAllElements():清空所有元素。
vector.remove(1); // 删除索引为1的元素
vector.remove("Apple"); // 删除元素"Apple"
vector.removeAllElements(); // 清空Vector

3. 获取和修改元素

  • get(int index):获取指定索引的元素。
  • set(int index, E element):替换指定索引的元素。
  • elementAt(int index):与 get 功能相同(Vector 特有的方法)。
  • setElementAt(E obj, int index):与 set 功能相同。
String fruit = vector.get(0); // 获取第一个元素
vector.set(1, "Blueberry"); // 替换第二个元素

4. 容量和大小

  • size():返回当前元素数量。
  • capacity():返回当前数组的容量。
  • ensureCapacity(int minCapacity):确保容量至少为 minCapacity
  • trimToSize():将数组容量调整为当前元素数量。
System.out.println(vector.size()); // 输出元素数量
System.out.println(vector.capacity()); // 输出当前容量

四、Vector的线程安全机制

1. 同步方法

  • 所有方法通过 synchronized 关键字修饰,确保同一时刻只有一个线程访问。
  • 示例:
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

2. 优点

  • 简单易用,无需手动同步。
  • 多线程环境下无需额外加锁。

3. 缺点

  • 性能开销:每次方法调用都需要获取锁,高并发下性能较低。
  • 锁粒度粗:整个 Vector 被加锁,即使只操作单个元素,也会阻塞其他线程。

五、Vector的扩容机制

1. 初始容量

  • 默认初始容量为 10(若未指定)。
  • 可通过构造函数自定义初始容量。

2. 扩容策略

  • 默认扩容:若 capacityIncrement <= 0,容量翻倍(newCapacity = oldCapacity * 2)。
  • 指定扩容增量:容量增加 capacityIncrementnewCapacity = oldCapacity + capacityIncrement)。

示例

Vector<Integer> vector = new Vector<>(5, 3); // 初始容量5,增量3
for (int i = 0; i < 10; i++) {
    vector.add(i);
}
System.out.println(vector.capacity()); // 输出 11(5 → 5+3=8 → 8+3=11)

六、Vector与ArrayList的对比

特性VectorArrayList
线程安全✅ 是(方法级同步)❌ 否
性能较低(同步锁开销)
扩容策略默认扩容为 2 倍扩容为 1.5 倍
适用场景多线程环境单线程或需手动同步的场景
替代方案CopyOnWriteArrayListCollections.synchronizedList

七、Vector的使用注意事项

1. 快速失败的迭代器

  • 使用 Iterator 遍历时,如果在迭代过程中修改 Vector(如 addremove),会抛出 ConcurrentModificationException
  • 解决方案:使用 Enumeration 或在遍历时对 Vector 加锁。
// 快速失败示例
Vector<String> vector = new Vector<>(Arrays.asList("A", "B", "C"));
for (String s : vector) {
    if (s.equals("B")) {
        vector.remove(s); // 抛出 ConcurrentModificationException
    }
}

2. 内存开销

  • 扩容可能导致内存浪费(如频繁扩容时)。
  • 建议根据业务需求合理设置初始容量和容量增量。

八、Vector的应用场景

1. 推荐使用场景

  • 小规模多线程环境(如连接池、缓存)。
  • 需要简单线程安全的集合,且性能要求不高。

2. 替代方案

  • 高并发场景:使用 CopyOnWriteArrayList(写时复制,读性能高)。
  • 单线程场景:使用 ArrayList(性能更高)。
  • 需要手动同步:使用 Collections.synchronizedList(new ArrayList<>())

九、Vector示例代码

import java.util.Vector;
public class VectorExample {
    public static void main(String[] args) {
        // 创建Vector
        Vector<String> vector = new Vector<>(5, 2); // 初始容量5,增量2
        // 添加元素
        vector.add("Apple");
        vector.add("Banana");
        vector.insertElementAt("Cherry", 1);
        // 遍历Vector
        System.out.println("Vector元素: " + vector);
        for (String fruit : vector) {
            System.out.println(fruit);
        }
        // 修改元素
        vector.set(1, "Blueberry");
        // 删除元素
        vector.remove("Apple");
        // 输出结果
        System.out.println("修改后的Vector: " + vector);
    }
}

十、总结

Vector 是 Java 早期提供的线程安全动态数组,尽管其同步机制简化了多线程开发,但性能开销较大。现代 Java 开发中,推荐使用更高效的线程安全集合类(如CopyOnWriteArrayList)或非线程安全的 ArrayList 并手动同步。理解 Vector 的特性、扩容策略和适用场景,有助于在特定需求下合理选择数据结构。

到此这篇关于【Java第85集】java Vector类详解的文章就介绍到这了,更多相关java Vector类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用maven war包打包去除jar包瘦身

    使用maven war包打包去除jar包瘦身

    这篇文章主要介绍了使用maven war包打包去除jar包瘦身操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解Java中使用externds关键字继承类的用法

    详解Java中使用externds关键字继承类的用法

    子类使用extends继承父类是Java面向对象编程中的基础知识,这里我们就来详解Java中使用externds关键字继承类的用法,需要的朋友可以参考下
    2016-07-07
  • java并发编程JUC CountDownLatch线程同步

    java并发编程JUC CountDownLatch线程同步

    这篇文章主要介绍CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代码例子来展开对java并发编程JUC CountDownLatch线程同步,需要的朋友可以参考下面文章内容
    2021-09-09
  • 解决SpringBoot多模块发布时99%的问题

    解决SpringBoot多模块发布时99%的问题

    本文归纳了以下 8 个原则和发布时经常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎可以解决绝大数SpringBoot发布问题
    2019-07-07
  • Java结构型模式之桥接模式详解

    Java结构型模式之桥接模式详解

    桥接模式是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过桥接模式将这两个维度分离出来,使两者可以独立扩展
    2023-02-02
  • SpringBoot使用swagger生成api接口文档的方法详解

    SpringBoot使用swagger生成api接口文档的方法详解

    在之前的文章中,使用mybatis-plus生成了对应的包,在此基础上,我们针对项目的api接口,添加swagger配置和注解,生成swagger接口文档,需要的可以了解一下
    2022-10-10
  • Java启动时循环依赖处理方式

    Java启动时循环依赖处理方式

    解决Spring Boot启动时由于SwaggerAutoConfiguration注解重复启用导致的循环导入问题,通过排除SwaggerAutoConfiguration并手动开启Swagger配置
    2026-01-01
  • Java中Map.Entry()含义及方法使用代码

    Java中Map.Entry()含义及方法使用代码

    这篇文章主要介绍了Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其核心作用是高效访问和操作Map中的键值对,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06
  • java中的构造函数什么时候被调用执行

    java中的构造函数什么时候被调用执行

    这篇文章主要介绍了java中的构造函数什么时候被调用执行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 基于Java解决华为机试之字符串加解密 

    基于Java解决华为机试之字符串加解密 

    这篇文章主要介绍了基于Java解决华为机试之字符串加解密,问题描述展开主题即详细代码的分享完成文章内容,具有一的的参考价值,需要的小伙伴可以参考一下。希望对你有所帮助
    2022-02-02

最新评论