当前位置: 首页 > article >正文

Java中的Vector,看着陌生?

Vector和ArrayList都是AbstractList的子类,二者有啥区别呢?Vector很少用,但是其父类Stack却常见在各类项目工程中。

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
```
```}

Vector和ArrayList是 Java 中两种常用的动态数组实现,但它们之间有一些重要的区别。以下是它们的主要区别以及各自的使用场景:

主要区别

  1. 线程安全性

    • VectorVector 是线程安全的,因为它的所有方法都是同步的(synchronized)。这意味着在多线程环境中,Vector 可以防止多个线程同时修改它的数据,从而保持数据的一致性。
    • ArrayListArrayList 不是线程安全的。如果多个线程同时访问和修改同一个 ArrayList 实例,可能会发生并发修改异常(ConcurrentModificationException)或数据不一致问题。
// Vector方法都有synchronizexd关键字修饰
public synchronized void addElement(E obj) {}

public synchronized boolean removeElement(Object obj) {}

public synchronized E get(int index) {}

...
```
// ArrayList方法不是线程安全的
public boolean add(E e) {}

public E remove(int index) {}

public abstract E get(int index)
  1. 性能

    • Vector:由于 Vector 的方法是同步的,因此在单线程环境中,Vector 的性能通常比 ArrayList 差。
    • ArrayListArrayList 的方法不是同步的,因此在单线程环境中,ArrayList 的性能通常比 Vector 好。
  2. 扩容机制

    • Vector:每次扩容时,默认会将容量增加一倍(可以通过构造函数指定增长因子)。
    • ArrayList:每次扩容时,默认将容量增加 50%。
// Vector#grow() 2倍扩容,或者使用初始化时指定步长扩容
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    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);
}
// ArrayList#grow() 1.5倍扩容
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

使用场景

  1. Vector

    • 适用于需要线程安全的动态数组场景。例如,在多线程环境中,如果需要频繁地读取和修改列表数据,Vector 可能是一个合适的选择。
    • 由于 Vector 的同步开销,推荐优先考虑使用其他同步集合类,如 Collections.synchronizedList(new ArrayList<>()) 或 CopyOnWriteArrayList
  2. ArrayList

    • 适用于大多数单线程或需要较高性能的动态数组场景。例如,在 GUI 应用程序中,通常会使用 ArrayList 来存储和管理元素列表。

为什么项目中很少用到 Vector

  1. 性能问题:由于 Vector 的所有方法都是同步的,在单线程环境中使用 Vector 会导致不必要的性能开销。因此,在不需要线程安全的情况下,ArrayList 更受欢迎。
  2. 替代方案:在需要线程安全的环境中,Java 提供了更好的替代方案,如 Collections.synchronizedList(new ArrayList<>()) 或 CopyOnWriteArrayList,它们既提供了线程安全性,又有更好的性能和灵活性。
  3. 过时的设计Vector 是 Java 1.0 引入的集合类,而 ArrayList 是 Java 2(Collections Framework)引入的。随着 Java 集合框架的发展,ArrayList 和其他现代集合类逐渐取代了 Vector 的使用。

综上所述,ArrayList 通常是首选的动态数组实现,而 Vector 由于性能和设计问题,在现代 Java 项目中使用较少。


http://www.kler.cn/news/362171.html

相关文章:

  • 国家信息安全水平考试(NISP一级)最新题库-第十七章
  • Ubuntu下安装并初始化Git同时添加SSH密钥
  • excel将文本型数字转变为数值型数字
  • 江苏省医疗损害鉴定管理办法
  • 【报错处理】MR/Spark 使用 BulkLoad 方式传输到 HBase 发生报错: NullPointerException
  • 计算机网络—vlan(虚拟局域网)
  • API接口测试与优化:确保应用稳定性的必要步骤
  • Python 深度Q网络(DQN)算法详解与应用案例
  • 计算机网络考研笔记
  • 力扣题51~70
  • 动手学深度学习9.7. 序列到序列学习(seq2seq)-笔记练习(PyTorch)
  • 如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?
  • 集成必看!Air780E开发板集成EC11旋转编码器的可靠解决方案~
  • 二、Linux 系统命令
  • c++ 对象作用域
  • 代码随想录算法训练营第十九天|Day19二叉树
  • Python包——numpy2
  • 6,000 个网站上的假 WordPress 插件提示用户安装恶意软件
  • 前端 js 处理一个数组 展示成层级下拉样式
  • 理解和解决TCP 网络编程中的粘包与拆包问题
  • 【C++】创建TCP服务端
  • DLNA—— 开启智能生活多媒体共享新时代
  • 线性可分支持向量机的原理推导 9-23拉格朗日乘子α的最大化问题 公式解析
  • Spring中导致事务传播失效的情况(自调用、方法访问权限、异常处理不当、传播类型选择错误等。在实际开发中,务必确保事务方法正确配置)
  • 回溯法求解简单组合优化问题
  • 初学者怎么入门大语言模型(LLM)?