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

ArrayList_LinkedList_Vector区别

性能比较
访问性能对比
线程安全性对比
扩容机制演示
总结
性能比较
头部插入 LinkedList 最快(直接修改头指针)ArrayList 和 Vector 很慢(需要移动大量元素)。
中间插入 ArrayList 和 Vector 仍然需要移动元素,但 LinkedList 需要遍历到中间位置,因此时间也很长。
尾部插入 ArrayList 和 LinkedList 几乎一样快(数组扩容和链表追加),Vector 因为有同步而稍慢。

package com.jysemel.java.basic.collection;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class ListInsertPerformance {

private static final int INSERT_COUNT = 100_000; // 插入元素数量public static void main(String[] args) {// 测试头部插入testInsert("头部插入", list -> list.add(0, 1));// 测试中间插入testInsert("中间插入", list -> list.add(list.size() / 2, 1));// 测试尾部插入testInsert("尾部插入", list -> list.add(1));
}interface InsertOperation {void insert(List<Integer> list);
}private static void testInsert(String description, InsertOperation op) {ArrayList<Integer> arrayList = new ArrayList<>();LinkedList<Integer> linkedList = new LinkedList<>();Vector<Integer> vector = new Vector<>();System.out.println("=== " + description + " 测试 (" + INSERT_COUNT + "次) ===");long start, end;// ArrayListstart = System.nanoTime();for (int i = 0; i < INSERT_COUNT; i++) {op.insert(arrayList);}end = System.nanoTime();System.out.printf("ArrayList 耗时: %.2f ms%n", (end - start) / 1e6);// LinkedListstart = System.nanoTime();for (int i = 0; i < INSERT_COUNT; i++) {op.insert(linkedList);}end = System.nanoTime();System.out.printf("LinkedList 耗时: %.2f ms%n", (end - start) / 1e6);// Vectorstart = System.nanoTime();for (int i = 0; i < INSERT_COUNT; i++) {op.insert(vector);}end = System.nanoTime();System.out.printf("Vector 耗时: %.2f ms%n", (end - start) / 1e6);System.out.println();
}

}
访问性能对比
ArrayList 和 Vector 支持高效的随机访问(O(1)),而 LinkedList 则非常慢(O(n))

package com.jysemel.java.basic.collection;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class ListRandomAccess {

private static final int SIZE = 100_000;
private static final int ACCESS_COUNT = 1_000_000;public static void main(String[] args) {// 初始化列表ArrayList<Integer> arrayList = new ArrayList<>(SIZE);LinkedList<Integer> linkedList = new LinkedList<>();Vector<Integer> vector = new Vector<>(SIZE);for (int i = 0; i < SIZE; i++) {arrayList.add(i);linkedList.add(i);vector.add(i);}System.out.println("=== 随机访问性能测试(" + ACCESS_COUNT + "次)===");// ArrayListlong start = System.nanoTime();for (int i = 0; i < ACCESS_COUNT; i++) {int index = (int) (Math.random() * SIZE);arrayList.get(index);}long end = System.nanoTime();System.out.printf("ArrayList 耗时: %.2f ms%n", (end - start) / 1e6);// LinkedListstart = System.nanoTime();for (int i = 0; i < ACCESS_COUNT; i++) {int index = (int) (Math.random() * SIZE);linkedList.get(index);}end = System.nanoTime();System.out.printf("LinkedList 耗时: %.2f ms%n", (end - start) / 1e6);// Vectorstart = System.nanoTime();for (int i = 0; i < ACCESS_COUNT; i++) {int index = (int) (Math.random() * SIZE);vector.get(index);}end = System.nanoTime();System.out.printf("Vector 耗时: %.2f ms%n", (end - start) / 1e6);
}

}
线程安全性对比
Vector 方法使用 synchronized 修饰,保证了线程安全,但带来性能开销。
ArrayList 非线程安全 多线程环境下需要外部同步(如 Collections.synchronizedList)或使用 CopyOnWriteArrayList

package com.jysemel.java.basic.collection;

import java.util.ArrayList;
import java.util.Vector;

public class ListThreadSafety {

public static void main(String[] args) throws InterruptedException {// 测试 ArrayList (线程不安全)ArrayList<Integer> arrayList = new ArrayList<>();Thread t1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {arrayList.add(i);}});Thread t2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {arrayList.add(i);}});t1.start();t2.start();t1.join();t2.join();System.out.println("ArrayList 最终大小: " + arrayList.size());// 预期是2000,但实际可能小于2000,甚至抛出 ConcurrentModificationException 或 数组越界异常// 测试 Vector (线程安全)Vector<Integer> vector = new Vector<>();Thread t3 = new Thread(() -> {for (int i = 0; i < 1000; i++) {vector.add(i);}});Thread t4 = new Thread(() -> {for (int i = 0; i < 1000; i++) {vector.add(i);}});t3.start();t4.start();t3.join();t4.join();System.out.println("Vector 最终大小: " + vector.size());// 总是输出2000,不会出现异常
}

}
扩容机制演示

package com.jysemel.java.basic.collection;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Vector;

/**

  • 演示 ArrayList 和 Vector 的扩容机制
  • 运行前需要添加 JVM 参数(用于反射访问 ArrayList 内部数组):
  • --add-opens java.base/java.util=ALL-UNNAMED
    

*/
public class ListCapacityDemo {

public static void main(String[] args) throws Exception {// ---------- ArrayList 扩容演示 ----------System.out.println("=== ArrayList 扩容(初始容量 2,扩容因子 1.5)===");ArrayList<Integer> arrayList = new ArrayList<>(2); // 初始容量设为2System.out.println("初始容量: " + getCapacity(arrayList));for (int i = 1; i <= 10; i++) {arrayList.add(i);System.out.printf("添加第 %2d 个元素后,元素个数: %2d,底层数组容量: %2d%n",i, arrayList.size(), getCapacity(arrayList));}// ---------- Vector 扩容演示 ----------System.out.println("\n=== Vector 扩容(初始容量 2,扩容增量 3)===");Vector<Integer> vector = new Vector<>(2, 3); // 初始容量2,每次扩容增加3System.out.println("初始容量: " + vector.capacity());for (int i = 1; i <= 10; i++) {vector.add(i);System.out.printf("添加第 %2d 个元素后,元素个数: %2d,底层数组容量: %2d%n",i, vector.size(), vector.capacity());}
}/*** 通过反射获取 ArrayList 的底层数组长度(容量)*/
private static int getCapacity(ArrayList<?> list) throws Exception {Field field = ArrayList.class.getDeclaredField("elementData");field.setAccessible(true);return ((Object[]) field.get(list)).length;
}

}
总结
ArrayList: 动态数组,随机访问快(O(1)),尾部插入快,线程不安全,扩容1.5倍。
LinkedList: 双向链表,头部插入快(O(1)),随机访问慢(O(n)),线程不安全,无需扩容。
Vector: 动态数组,线程安全(synchronized),性能差,扩容2倍或指定增量,已淘汰。
选型:默认ArrayList;频繁头插改删用LinkedList;多线程用CopyOnWriteArrayList。

http://www.jsqmd.com/news/439603/

相关文章:

  • 2026专业酒窖定制费用,北京上海靠谱酒窖定制推荐,怎么选 - 工业品牌热点
  • 2026年服务完善的金融证券律师靠谱吗,行业解读来支招 - 工业推荐榜
  • Service Desk Technical Skills Bootcamp
  • 机器学习算法原理与实践-入门(二):距离计算方式详解 - 教程
  • 2026年金属探伤仪厂家权威推荐:超声波/便携式/旋转探伤仪及自动化检测系统源头技术企业精选 - 品牌推荐官
  • 寻茶宁波:2026年60年树龄高端荒野红茶厂家汇总,高端红茶/高端养生红茶,60年树龄高端荒野红茶直销厂家排行榜单 - 品牌推荐师
  • 性能优化:跨服务使用分布式缓存的3个思考
  • 2026年口碑好的景区标识牌生产商盘点,重庆古奥值得关注 - myqiye
  • 2026年AI获客宋武深度解析:实战派AI获客领军人物的核心优势与市场前景 - 品牌推荐
  • # 纽约出行机票全攻略:特价预订+机场指南,省心飞美不踩坑 - 今日又土又金
  • 2026年中国离婚财产分割律师电话查询推荐:高效解决财产纠纷 - 品牌推荐
  • CoPaw安装部署
  • 2026年3月车牌识别一体机公司推荐,高性能与可靠性兼具的优质品牌 - 品牌鉴赏师
  • 探讨辽宁电地热优质厂家排名,前十名有哪些? - 工业推荐榜
  • 删除 Excel 表格中的重复行 【4 种实用方法】 - E
  • 讯睿CMS_Xunruicms忘记网站管理员密码怎么办?重置还是找回,附修改方法和代码
  • 2026年深度解析AI获客宋武:实战派AI获客领军人物的核心方法论剖析 - 品牌推荐
  • 2026年上海离婚纠纷律师电话查询推荐:精选推荐与使用指南 - 品牌推荐
  • 2026西安策划服务 五家优质机构解锁活动办会新体验 - 深度智识库
  • 2026年38妇女节活动优麦云折扣码分享 专属优麦云优惠折扣码全线产品可享7折 - 麦麦唛
  • 2026年3月充电桩停车位管理系统公司推荐:行业测评与选择指南 - 品牌鉴赏师
  • 分享一些2026年有意思的现代化Django生态组件
  • 2026年上海离婚纠纷律师电话查询推荐:专业律师团队联系方式汇总 - 品牌推荐
  • 分析室内设计找哪家,2026年上海高口碑公司推荐 - myqiye
  • 分布鲁棒联合机会约束下的能量和备用调度:Matlab实现探秘
  • HEIC图片怎么转JPG?分享几个实用的在线HEIC转JPG工具网站
  • 2026年3月可拆卸法兰防护罩厂家推荐,专业制造与品牌保障口碑之选 - 品牌鉴赏师
  • 2026年方形摇摆筛推荐,性能优越的品牌值得拥有 - 工业推荐榜
  • 2026年中国离婚财产分割律师电话查询推荐:精选推荐与使用指南 - 品牌推荐
  • 广州优质康养机构推荐榜:越秀康养悦麓居、越秀悦麓为民护理院、越秀悦麓居养老院、越秀悦麓颐养中心、广州悦麓居选择指南 - 优质品牌商家