java中Vector的详细说明

 更新时间:2025年10月20日 11:16:02   作者:悟能不能悟  
Vector是Java早期的线程安全动态数组,支持自动扩容和有序可重复元素,因同步机制性能较低,已被ArrayList等替代,现代开发中,推荐使用ArrayList或并发容器而非Vector

1. Vector 是什么?

Vector是 Java 早期版本(从 JDK 1.0 开始)就存在的一个动态数组实现。它位于 java.util包中,是 Java 集合框架(Java Collections Framework, JCF)的一部分。

本质​:一个可以根据需要自动增长和缩小的对象数组。

特点​:

  • 有序(Ordered)​​:元素按照插入的顺序存放,可以通过整数索引(从 0 开始)精确地访问每个元素。
  • 可重复​:允许包含重复的元素。
  • 线程安全(Synchronized)​​:这是 Vector最显著的特点之一。其绝大多数公共方法(如 add, get, remove)都使用了 synchronized关键字修饰,保证了在多线程环境下,同一时间只有一个线程能对 Vector 实例进行修改或读取,从而避免了数据的不一致性。

2. 核心特性详解

a) 动态扩容

这是 Vector和原始数组最根本的区别。你无需在创建时指定最终的大小,它会自动管理容量。

  • 初始容量(Initial Capacity)​​:创建 Vector时内部的数组大小。默认是 ​10
  • 扩容增量(Capacity Increment)​​:可以指定一个增量值。当需要扩容时,新的容量将是 旧容量 + 增量值。如果创建时未指定增量(或指定为 0),则默认策略是扩容为原来的 2 倍​(newCapacity = oldCapacity * 2)。
  • 扩容时机​:当尝试添加一个新元素(例如 add(e))并且当前元素数量已经等于内部数组的长度时,就会触发扩容操作。

示例:​

Vector<String> vector = new Vector<>(); // 初始容量=10, 增量=0(默认2倍扩容)
for (int i = 0; i < 11; i++) {
    vector.add("Element " + i); // 添加第11个元素时,容量从10扩到20
}

b) 线程安全

正如之前提到的,Vector的方法大多是同步的。这意味着它在多线程环境下是安全的,你可以多个线程同时操作一个 Vector而不会破坏其内部状态(如不会造成数据覆盖)。

示例代码片段(查看源码):​

// Vector 的 add 方法源码大致长这样:
public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1); // 检查并扩容
    elementData[elementCount++] = e;
    return true;
}
 
// get 方法也是同步的
public synchronized E get(int index) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);
    return elementData(index);
}

3. 优缺点分析

优点:

  1. 线程安全​:最大的优点,在不需要额外代码的情况下,即可用于多线程场景。
  2. 使用简单​:作为动态数组,其 API 直观易用,避免了原始数组的固定大小限制。

缺点:

  1. 性能开销​:​这是最关键的缺点。同步(synchronized)带来了巨大的性能代价。每次方法调用都需要获取和释放锁,这在单线程环境下是完全不必要的开销,会导致程序变慢。
  2. 过时的设计​:在 Java 1.2 引入更现代的集合框架(如 ArrayList, HashMap)之后,Vector虽然被保留了,但通常被认为是一种“遗留类”(Legacy Class)。它的方法名(如 addElement, elementAt)也没有遵循新的集合接口约定(如 add, get),尽管为了兼容它也实现了这些新方法。
  3. 不如现代的并发集合​:即使在需要线程安全的场景下,Java 5 引入的 java.util.concurrent包中的集合类(如 CopyOnWriteArrayList, ConcurrentHashMap)通常提供了更优的性能和更精细的锁策略(如读写锁、写时复制)。

4. Vector vs ArrayList

这是最常被问到的问题。ArrayListVector的非同步现代替代品。

特性

Vector

ArrayList

线程安全

​ (同步方法)

性能

较低 (因同步开销)

较高​ (无同步开销)

扩容策略

默认2倍,可指定增量

默认1.5倍 (int newCapacity = oldCapacity + (oldCapacity >> 1))

历史

JDK 1.0,遗留类

JDK 1.2,现代集合框架主力

迭代器

Fail-fast,但枚举器不是

Fail-fast

推荐使用

极少,仅在遗留系统或非常简单的多线程场景

绝大多数单线程场景的首选

5. 如何使用 Vector?

尽管不推荐在新项目中使用,但了解其 API 仍有必要。

创建 Vector:​

// 1. 默认构造:容量10,扩容时容量翻倍
Vector<String> vec1 = new Vector<>();
 
// 2. 指定初始容量
Vector<String> vec2 = new Vector<>(100);
 
// 3. 指定初始容量和扩容增量
Vector<String> vec3 = new Vector<>(100, 10); // 每次扩容增加10
 
// 4. 通过其他集合创建
List<String> list = Arrays.asList("A", "B", "C");
Vector<String> vec4 = new Vector<>(list);

基本操作:​

Vector<Integer> vector = new Vector<>();
 
// 添加元素
vector.add(10);
vector.add(20);
vector.add(1, 15); // 在索引1处插入
 
// 获取元素
int element = vector.get(0); // 10
 
// 修改元素
vector.set(0, 100); // 将索引0改为100
 
// 删除元素
vector.remove(0); // 删除索引0的元素
vector.remove(Integer.valueOf(20)); // 删除值为20的元素
 
// 大小和容量
int size = vector.size(); // 元素数量
int capacity = vector.capacity(); // 当前底层数组的容量
 
// 遍历 (推荐方式)
for (Integer num : vector) {
    System.out.println(num);
}
 
// 枚举器 (古老的方式,不推荐)
Enumeration<Integer> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
    System.out.println(enumeration.nextElement());
}

6. 现代开发中的替代方案和建议

单线程环境​:

  • ​绝对首选 ArrayList。它没有同步开销,性能远超 Vector

多线程环境​:

  • 需要同步的 List​:可以使用 Collections.synchronizedList(new ArrayList())来包装一个 ArrayList,这样得到的 List 是同步的。这比直接使用 Vector更灵活,因为你可以在需要同步时再包装,不需要时就用原始的 ArrayList
  • 高并发读,少写​:考虑使用 CopyOnWriteArrayList。它在写操作时复制整个新数组,读操作无需加锁,性能极高。
  • 需要更复杂的并发操作​:使用 java.util.concurrent包下的其他并发集合类。

​示例:使用 Collections.synchronizedList​

List<String> syncedList = Collections.synchronizedList(new ArrayList<>());
 
// 在迭代时,你必须手动同步!
synchronized(syncedList) {
    Iterator<String> i = syncedList.iterator();
    while (i.hasNext()) {
        System.out.println(i.next());
    }
}

总结

  • Vector是一个线程安全的、动态扩容的数组实现。
  • 它的同步特性导致性能较差,是其在现代开发中不被推荐的主要原因。
  • 单线程环境中,​总是优先使用 ArrayList
  • 多线程环境中,优先考虑 Collections.synchronizedList()CopyOnWriteArrayList或其他 java.util.concurrent包下的并发容器,而不是 Vector

理解 Vector更多的是为了理解 Java 集合框架的历史和线程安全的概念,而不是为了在新代码中使用它。

到此这篇关于java中Vector的详细说明的文章就介绍到这了,更多相关java Vector内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Log4j关闭Spring和Hibernate日志打印方式

    Log4j关闭Spring和Hibernate日志打印方式

    这篇文章主要介绍了Log4j关闭Spring和Hibernate日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • idea2020.3测试评价及感受

    idea2020.3测试评价及感受

    idea2020.3版本这次变化最大的也就是 UI了完全抛弃了之前一直使用的模板更改成了新的样式,感兴趣的朋友快来下载体验下吧
    2020-10-10
  • 详解SpringBoot读取resource目录下properties文件的常见方式

    详解SpringBoot读取resource目录下properties文件的常见方式

    这篇文章主要介绍了SpringBoot读取resource目录下properties文件的常见方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • redisson常用加锁方式详解

    redisson常用加锁方式详解

    文章介绍了两种Redisson加锁方式的区别:基本的RLock方式和使用RedissonDistributedLocker的tryLock方式,RLock需要手动处理锁的等待和持有时间,而tryLock则提供了更高层次的封装,简化了锁的操作,并且在超时后会自动返回或释放锁
    2026-01-01
  • java截取图片示例

    java截取图片示例

    这篇文章主要介绍了java截取图片示例,把代码中的图片路径改成自己的图片,运行就可以看到效果了,需要的朋友可以参考下
    2014-03-03
  • 详解如何有效地处理Java中的多线程

    详解如何有效地处理Java中的多线程

    在现代软件开发中,多线程编程已成为提高程序性能和响应速度的重要手段,Java提供了丰富的多线程支持,使得在Java中实现并发操作变得相对简单,本文将深入探讨Java多线程编程的基本概念、常见问题和最佳实践,需要的朋友可以参考下
    2024-06-06
  • Java static关键字详细解析

    Java static关键字详细解析

    这篇文章主要介绍了Java static关键字详细解析,java中的static关键字主要用于内存管理,可以用在变量、方法、代码块和嵌套类中。更多相关介绍,需要的小伙伴可以参考一下
    2022-08-08
  • MyBatis配置文件元素示例详解

    MyBatis配置文件元素示例详解

    在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<contiguration>元素内配置,这篇文章主要介绍了MyBatis配置文件元素,需要的朋友可以参考下
    2023-06-06
  • Java SM2加密相关实现与简单原理详解

    Java SM2加密相关实现与简单原理详解

    SM2算法可以用较少的计算能力提供比RSA算法更高的安全强度,而所需的密钥长度却远比RSA算法低,这篇文章主要给大家介绍了关于Java SM2加密相关实现与简单原理的相关资料,需要的朋友可以参考下
    2024-01-01
  • 史上最全的java随机数生成算法分享

    史上最全的java随机数生成算法分享

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法
    2014-01-01

最新评论