Java中的Vector,看着陌生?

embedded/2024/10/24 3:29:34/

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 codeint 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 codeint 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.ppmy.cn/embedded/129975.html

相关文章

Redis设计与实现 学习笔记 第九章 数据库

第9章到第14章属于本书第二部分&#xff1a;单机数据库的实现。 9.1 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态结构redis.h/redisServer的db数组中&#xff0c;db数组的每一项都是一个redis.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库&…

Widget结构(一)

1、概念 Widget 是 UI 控件的基本抽象&#xff0c;它负责描述 UI 的一部分应该如何构建。每个Widget 都有一个对应的 RenderObject&#xff0c;负责实际的布局和绘制工作。Widget 不直接参与布局或绘制过程&#xff1b;它们只是描述了如何构建用户界面的一部分&#xff0c;并且…

基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

视频云存储/音视频流媒体视频平台EasyCVR视频汇聚平台在欧拉系统中启动失败是什么原因?

视频监控/视频集中存储/磁盘阵列EasyCVR视频汇聚平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xff0c;这为其在各种复杂环境下的部署提供了便利。 安防监控EasyCVR视频汇聚平…

关于QT cmake项目添加了.ui文件build未自动生成ui_xxx.h,错误提示找不到这个头文件问题处理

文章目录 问题分析举例 问题 当我们想使用cmakelist来编译运行一个QT项目时&#xff0c;当项目中存在Ui文件时&#xff0c;我们可能会遇到ui_XXX.h头文件找不到的问题。这里我们来分析并解决一下问题。 分析 不管是在cmake下或者qmake下的ui_XXX.h都是根据XXX.ui文件自动生成…

sealed class-kotlin中的封闭类

在 Kotlin 中&#xff0c;sealed class&#xff08;密封类&#xff09;是一种特殊的类&#xff0c;用于限制继承的类的数量。密封类可以被用来表示一组有限的类型&#xff0c;通常用于状态管理或表达多种可能的错误类型。 密封类用 sealed 关键字定义&#xff0c;这意味着只能…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件&#xff0c;执行shell命令_shell在pycharm-CSDN博客 和深度学习&#xff1a;PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后&#xff0c;发现在Windows的PyCharm中直接右键运行sh文件&#xff0c;存在如下…

Numba: 使用GPUs加速python

作为python函数的即时编译器&#xff0c;Numba是直接在标准python解释器中运行的&#xff0c;所以我们可以直接在GPU上运行用python写的CUDA kernels&#xff08;在显卡上运行的函数&#xff09;&#xff0c;换句话说&#xff0c;Numba可以让我们直接使用python而非学习一门新语…