Vector详细介绍


Vector 是 Java 中的一个类,位于 java.util 包中,它实现了一个动态数组的数据结构,能够存储任意类型的对象。Vector 是 Java 早期引入的集合类之一,在 Java 1.0 中就已存在。它提供了线程安全的实现,因此在多线程环境中可以使用而不必担心线程同步问题。

虽然 Vector 是线程安全的,但是它的使用逐渐被 ArrayList 等现代集合类取代,因为 Vector 的性能相对较低。它的同步操作会带来额外的开销,不推荐在非线程安全的环境中使用。

1. Vector 的基本特性

  • 动态数组Vector 本质上是一个可以自动增长和收缩的动态数组。它的容量会根据需要自动增加以适应新元素的添加。
  • 线程安全Vector 的所有方法都是同步的,因此是线程安全的。多个线程可以同时访问 Vector,而不需要外部同步。
  • 实现了 List 接口Vector 实现了 List 接口,提供了列表的所有操作,如添加、删除、修改、遍历等。
  • 允许存储重复元素Vector 可以存储重复元素,也允许存储 null 值。
  • 实现了 Serializable 接口Vector 可以被序列化,因此可以通过流的方式进行读写。

2. Vector 类的结构

Vector 类的定义如下:

public class Vector<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
实现的接口:
  • List<E>:提供列表的基本操作。
  • RandomAccess:支持快速随机访问。
  • Cloneable:支持克隆操作。
  • Serializable:支持序列化操作。

3. Vector 的常用方法

Vector 提供了一些常用的方法用于操作元素,如添加、删除、修改、查找等。下面是一些常用的方法:

  • 添加元素

    • boolean add(E e):将元素添加到 Vector 的末尾。
    • void add(int index, E element):在指定位置插入元素。
    • boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到 Vector 中。
  • 删除元素

    • E remove(int index):删除指定位置的元素。
    • boolean remove(Object o):删除第一次出现的指定元素。
    • void clear():删除所有元素,清空 Vector
  • 修改元素

    • E set(int index, E element):将指定位置的元素替换为给定的元素。
  • 查找元素

    • E get(int index):返回指定位置的元素。
    • int indexOf(Object o):返回指定元素第一次出现的位置。
    • boolean contains(Object o):检查 Vector 中是否包含指定的元素。
  • 其他操作

    • int size():返回 Vector 中的元素数量。
    • boolean isEmpty():检查 Vector 是否为空。
    • Object[] toArray():将 Vector 转换为数组。

4. Vector 的示例代码

以下是一个使用 Vector 类的简单示例,演示了如何添加、删除、修改、查找元素以及遍历 Vector

import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        // 创建一个 Vector 实例
        Vector<String> vector = new Vector<>();

        // 添加元素到 Vector 中
        vector.add("Apple");
        vector.add("Banana");
        vector.add("Cherry");
        System.out.println("Vector 元素: " + vector);

        // 在指定位置添加元素
        vector.add(1, "Orange");
        System.out.println("添加 Orange 后的 Vector: " + vector);

        // 删除指定位置的元素
        vector.remove(2);
        System.out.println("删除索引为 2 的元素后: " + vector);

        // 修改指定位置的元素
        vector.set(0, "Mango");
        System.out.println("修改索引为 0 的元素后: " + vector);

        // 查找元素
        String element = vector.get(1);
        System.out.println("索引为 1 的元素是: " + element);

        // 检查 Vector 中是否包含指定元素
        boolean contains = vector.contains("Banana");
        System.out.println("Vector 是否包含 Banana? " + contains);

        // 遍历 Vector
        System.out.println("遍历 Vector:");
        for (String fruit : vector) {
            System.out.println(fruit);
        }
    }
}
示例输出:
Vector 元素: [Apple, Banana, Cherry]
添加 Orange 后的 Vector: [Apple, Orange, Banana, Cherry]
删除索引为 2 的元素后: [Apple, Orange, Cherry]
修改索引为 0 的元素后: [Mango, Orange, Cherry]
索引为 1 的元素是: Orange
Vector 是否包含 Banana? false
遍历 Vector:
Mango
Orange
Cherry

5. Vector 的增长策略

Vector 的初始容量为 10,当 Vector 容量不足时,会自动扩展。扩展的策略是当前容量的两倍。例如,当 Vector 的容量为 10 时,如果添加第 11 个元素,容量将扩展为 20。这种增长策略与 ArrayList 类似,后者也是使用动态数组实现的。

不过,与 ArrayList 不同的是,Vector 可以通过 ensureCapacity(int minCapacity) 方法手动设置扩展容量。这个方法允许开发者在需要大量添加元素之前预先扩展 Vector 的容量,以减少扩展的频率和开销。

6. VectorArrayList 的对比

尽管 VectorArrayList 都是基于数组的数据结构,并实现了 List 接口,但它们之间存在一些重要的区别:

6.1 为什么 Vector 逐渐被淘汰?
  1. 性能问题Vector 的所有方法都使用了 synchronized 关键字进行同步,因此在多线程环境中会有大量的同步开销。相反,ArrayList 没有这种开销,性能更优。

  2. 设计理念的更新:Java 的集合框架在 Java 1.2 中进行了重构,引入了新的集合类(如 ArrayListLinkedListHashMap 等),它们提供了更灵活的线程安全控制方式。开发者可以选择在需要时手动同步(例如通过使用 Collections.synchronizedList() 方法)。

  3. 过时的同步方式Vector 使用的是早期的同步方式,而现代 Java 更推荐使用 java.util.concurrent 包中的并发集合类(如 CopyOnWriteArrayList)来应对并发场景。

7. 替代 Vector 的线程安全集合类

如果需要线程安全的集合类,可以考虑使用 java.util.concurrent 包中的类,如:

  • CopyOnWriteArrayList:适用于读操作多、写操作少的场景,读操作不会加锁,写操作则会加锁并复制数组。
  • Collections.synchronizedList(List<T> list):将非线程安全的 List 转换为线程安全的 List,适用于需要对 ArrayList 进行同步的场景。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SynchronizedListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        List<String> synchronizedList = Collections.synchronizedList(list);

        synchronizedList.add("Apple");
        synchronizedList.add("Banana");
        synchronizedList.add("Cherry");

        synchronized (synchronizedList) {  // 手动同步
            for (String fruit : synchronizedList) {
                System.out.println(fruit);
            }
        }
    }
}

8. 总结

Vector 是 Java 中一种早期的集合类,提供了动态数组的功能,并且是线程安全的。虽然它的所有操作都是同步的,适合多线程环境,但由于同步开销较大,性能较低,现代 Java 开发更倾向于使用 ArrayListCopyOnWriteArrayList 等更高效、更灵活的集合类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Fish_Xuan

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值