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类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现HttpGet请求传body参数

    Java实现HttpGet请求传body参数

    这篇文章主要为大家详细介绍了Java实现HttpGet请求传body参数的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Java局部内部类原理与用法实例分析

    Java局部内部类原理与用法实例分析

    这篇文章主要介绍了Java局部内部类原理与用法,结合实例形式分析了Java局部内部类功能、用法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java框架解说之BIO NIO AIO不同IO模型演进之路

    Java框架解说之BIO NIO AIO不同IO模型演进之路

    网上很多IO资料,对新手来说,越看越晕。根据自己的理解,总结对比了一下BIO、NIO、AIO,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • MyBatis项目的创建和增删查改操作详解

    MyBatis项目的创建和增删查改操作详解

    这篇文章主要介绍了MyBatis项目的创建和增删查改操作,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-11-11
  • Java并发编程中的ConcurrentLinkedQueue详解

    Java并发编程中的ConcurrentLinkedQueue详解

    这篇文章主要介绍了Java并发编程中的ConcurrentLinkedQueue详解,GetThread线程不会因为ConcurrentLinkedQueue队列为空而等待,而是直接返回null,所以当实现队列不空时,等待时,则需要用户自己实现等待逻辑,需要的朋友可以参考下
    2023-12-12
  • mybatisPlus填坑之逻辑删除的实现

    mybatisPlus填坑之逻辑删除的实现

    本文主要介绍了mybatisPlus填坑之逻辑删除的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java注解之Retention、Documented、Inherited介绍

    Java注解之Retention、Documented、Inherited介绍

    这篇文章主要介绍了Java注解之Retention、Documented、Inherited注解介绍,本文内容和相关文章是系列文章,需要的朋友可以参考下
    2014-09-09
  • Mybatis分页插件PageHelper的配置和简单使用方法(推荐)

    Mybatis分页插件PageHelper的配置和简单使用方法(推荐)

    在使用Java Spring开发的时候,Mybatis算是对数据库操作的利器了。这篇文章主要介绍了Mybatis分页插件PageHelper的配置和使用方法,需要的朋友可以参考下
    2017-12-12
  • Java的Spring框架中DAO数据访问对象的使用示例

    Java的Spring框架中DAO数据访问对象的使用示例

    这篇文章主要介绍了Java的Spring框架中DAO数据访问对象的使用示例,分为在Spring中DOA与JDBC以及与Hibernate的配合使用两种情况来进行演示,需要的朋友可以参考下
    2016-03-03
  • JVM调试命令与调试工具详解

    JVM调试命令与调试工具详解

    JVM statistics Monitoring,用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,这篇文章主要介绍了JVM调试命令与调试工具,需要的朋友可以参考下
    2023-10-10

最新评论