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

一文了解Java中 Vector、ArrayList、LinkedList 之间的区别

目录

1. 数据结构

Vector 和 ArrayList

LinkedList

2. 线程安全

Vector

ArrayList 和 LinkedList

3. 性能

插入和删除操作

随机访问

4. 内存使用

ArrayList 和 Vector

LinkedList

5. 迭代器行为

ArrayList 和 Vector

LinkedList

6. 扩展策略

ArrayList

Vector

7. 典型用例

ArrayList

LinkedList

Vector

8. 总结


为了更加深入详细地介绍 Java 的 VectorArrayListLinkedList 的区别,我们将从以下几个方面进行探讨:数据结构、线程安全、性能、内存使用、迭代器行为、扩展策略和典型用例。

1. 数据结构

Vector 和 ArrayList

VectorArrayList 都是基于动态数组的数据结构。当需要更多空间时,它们会创建一个更大的数组并将旧数组中的内容复制到新数组中。

LinkedList

LinkedList 是基于双向链表的数据结构。每个元素(节点)都包含对前一个和后一个节点的引用。

2. 线程安全

Vector

Vector 是线程安全的,因为它的所有方法都使用了 synchronized 关键字。这确保了多个线程在访问 Vector 时不会发生数据不一致的情况。

ArrayList 和 LinkedList

ArrayListLinkedList 不是线程安全的。它们的方法没有使用 synchronized 关键字。在多线程环境中使用时,需要手动同步。

代码示例:手动同步 ArrayList

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class SynchronizedArrayListExample {public static void main(String[] args) {List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());synchronizedList.add("A");synchronizedList.add("B");synchronizedList.add("C");synchronized (synchronizedList) {for (String element : synchronizedList) {System.out.println(element);}}}
}

3. 性能

插入和删除操作
  • ArrayList:插入和删除操作(尤其是中间位置)可能涉及移动大量元素,效率较低。
  • LinkedList:插入和删除操作效率高,因为只需修改前后节点的引用。
随机访问
  • ArrayList:基于数组,支持快速的随机访问(O(1))。
  • LinkedList:需要遍历链表,随机访问性能较差(O(n))。

4. 内存使用

ArrayList 和 Vector

因为它们使用的是数组,所以除了存储实际元素外,没有额外的开销。

LinkedList

每个节点除了存储元素外,还需要存储两个引用(前一个和后一个节点),因此内存开销较大。

5. 迭代器行为

ArrayList 和 Vector

由于它们是基于数组的结构,所以迭代器在迭代过程中能直接访问数组中的元素。

LinkedList

迭代器需要遍历链表,从一个节点移动到下一个节点。

6. 扩展策略

ArrayList

默认情况下,ArrayList 的扩展策略是增加原来容量的50%。

代码示例:ArrayList 扩展

import java.util.ArrayList;public class ArrayListResizeExample {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>(2);arrayList.add(1);arrayList.add(2);// 第一次扩展arrayList.add(3);System.out.println("ArrayList size: " + arrayList.size());  // Output: ArrayList size: 3}
}
Vector

默认情况下,Vector 的扩展策略是增加原来容量的100%。

代码示例:Vector 扩展

import java.util.Vector;public class VectorResizeExample {public static void main(String[] args) {Vector<Integer> vector = new Vector<>(2);vector.add(1);vector.add(2);// 第一次扩展vector.add(3);System.out.println("Vector size: " + vector.size());  // Output: Vector size: 3}
}

7. 典型用例

ArrayList

适用于需要频繁随机访问元素的场景,如:

  • 存储和访问大量元素
  • 按索引访问元素
LinkedList

适用于需要频繁插入和删除元素的场景,如:

  • 实现队列或栈
  • 频繁的插入和删除操作
Vector

适用于需要线程安全的动态数组场景,如:

  • 多线程环境下的动态数组操作

8. 总结

特性VectorArrayListLinkedList
数据结构动态数组动态数组双向链表
线程安全性
插入/删除性能慢(需要移动元素)慢(需要移动元素)快(只需修改引用)
随机访问性能快(O(1))快(O(1))慢(O(n))
内存使用较低较低较高
扩展策略原容量的100%原容量的50%N/A
典型用例线程安全的动态数组操作频繁随机访问元素频繁插入和删除元素
http://www.lryc.cn/news/388688.html

相关文章:

  • 【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究
  • 【Win测试】窗口捕获的学习笔记
  • PostgreSQL的学习心得和知识总结(一百四十七)|深入理解PostgreSQL数据库之transaction chain的使用和实现
  • 宝塔linux网站迁移步骤
  • 电路笔记(三极管器件): MOSFETIGBT
  • Docker 镜像导出和导入
  • QueryClientProvider is not defined
  • HTTPS是什么?原理是什么?用公钥加密为什么不能用公钥解密?
  • 系统中非功能性需求的思考
  • 力扣第215题“数组中的第K个最大元素”
  • java.util.function实现原理和Java使用场景【Function、Predicate集合转换过滤,BiConsumer事件处理】
  • 《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成
  • pandas读取和处理Excel文件的基础应用1
  • electron vite react 创建一个项目
  • 鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
  • 湖南省教育网络协会莅临麒麟信安调研教育网络数字化建设及教育信创发展情况
  • 论文阅读_优化RAG系统的检索
  • STC8/32 软硬件I2C通讯方式扫描I2C设备地址
  • Linux——数据流和重定向,制作镜像
  • Windows 11的市场份额越来越大了,推荐你升级!
  • 微服务架构中的调试难题与分布式事务解决方案
  • 银行家算法-操作系统中避免死锁的最著名算法
  • PCL 基于点云RGB颜色的区域生长算法
  • cube-studio开源一站式机器学习平台,在线ide,jupyter,vscode,matlab,rstudio,ssh远程连接,tensorboard
  • 1976 ssm 营地管理系统开发mysql数据库web结构java编程计算机网页源码Myeclipse项目
  • 技术派全局异常处理
  • 对于mysql 故障的定位和排查
  • 什么是电航空插头插座连接器有什么作用
  • 数据挖掘常见算法(分类算法)
  • 【深度学习】调整加/减模型用于体育运动评估