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

LinkedList、Vector、Set

LinkedList

基本概念

LinkedList 是一个双向链表的实现类,它实现了 ListDequeQueueCloneable 接口,底层使用双向链表结构,适合频繁插入和删除操作。

主要特点

  • 有序,可重复。

  • 查询速度较慢,插入/删除速度较快(相较于 ArrayList)。

  • 允许 null 元素。

  • 线程不安全,效率高于 Vector

常用方法

方法描述
add(E e)在末尾添加元素
add(int index, E element)在指定位置插入元素
remove(int index)删除指定位置元素
get(int index)获取指定位置元素
getFirst() / getLast()获取第一个 / 最后一个元素
removeFirst() / removeLast()删除第一个 / 最后一个元素
offer(E e)添加到队列末尾
poll()弹出队列头部元素

适用场景

  • 频繁增删元素的场景,如队列、栈的实现。

  • 实现双向队列(Deque)。

JAVA中实现队列

// 创建单向链表
LinkedList<String> list = new LinkedList<>();
​
// 添加元素
list.push("元素1");
list.push("元素2");
list.push("元素3");
​
// 遍历链表System.out.println("未移除的链表元素:" + list);
​
//移除元素 最新添加的元素
list.remove();
​
// 遍历链表
System.out.println("移除最新元素后的链表元素:" + list);
​
//创建双向链表
LinkedList<String> queue = new LinkedList<>();
queue.offer("元素A");
queue.offer("元素B");
queue.offer("元素C");
​
// 遍历双向链表
System.out.println("链表元素:" + queue.poll()); // 获取并移除头部元素

Vector

基本概念

Vector 是一种动态数组的实现,线程安全,是 Java 早期的集合类之一。它实现了 List 接口。

主要特点

  • 底层是数组,支持快速随机访问。

  • 增长方式为:容量不足时,扩容为原来的 2 倍

  • 线程安全:所有方法都是同步(synchronized)方法,效率比 ArrayList 低。

  • 允许 null 元素。

常用方法

方法描述
add(E e)添加元素到末尾
add(int index, E element)在指定位置插入
remove(int index)移除指定位置元素
get(int index)获取指定索引元素
size()获取大小
capacity()当前容量
trimToSize()将容量调整为当前大小,节省内存
ensureCapacity(int minCapacity)确保最小容量

适用场景

  • 多线程并发环境中需要使用线程安全的 List。

  • 遗留系统或兼容旧代码(现代开发中很少使用)。

总结对比

Set相关知识

Set 是 Java 集合框架中一个 不允许重复元素 的集合接口。

它的常见实现类包括:

  • HashSet:基于哈希表,无序,查找/插入快。

  • TreeSet:基于红黑树,有序,可排序。

  • LinkedHashSet:有插入顺序,内部基于 HashSet + 双向链表。

HashSet

HashSet 是一个基于 HashMap 实现的 Set,底层使用哈希表来存储元素,不保证元素顺序

public HashSet() {map = new HashMap<>();
}

实际上每个元素都作为 HashMapkey 存储,value 是一个固定对象 PRESENT

添加元素时,先调用 hashCode() → 再调用 equals() 判断是否重复。

时间复杂度:增删查为 O(1)(理想状态下),HashSet 无序的原因是:元素存储在哈希桶中,位置取决于 hashCode

Set<String> set = new HashSet<>();// 添加元素set.add("Hello");set.add("World");set.add("!!");
​//遍历元素for (String s : set) {System.out.println(s);}

TreeSet

TreeSet 是一个有序的 Set,底层基于 红黑树(自平衡二叉搜索树),元素自动按排序顺序排列,不允许重复元素

Set<Integer> treeSet = new HashSet<>();
// 添加元素
treeSet.add(5);
treeSet.add(9);
treeSet.add(3);
treeSet.add(1);
treeSet.add(7);
​
// 遍历元素
treeSet.forEach(System.out::println);
特性HashSetTreeSet
元素是否排序❌ 无序✅ 自动排序
底层结构HashMapTreeMap(红黑树)
插入复杂度O(1)O(log n)
是否允许 null✅ 允许一个⚠️ 最多允许一个(仅在无 Comparator 情况下)
是否线程安全❌ 否❌ 否

特性LinkedListVector
底层结构双向链表动态数组
是否线程安全
插入删除效率
随机访问效率
是否过时是(被 ArrayList + Collections.synchronizedList() 替代)
适用场景队列、栈等多线程旧代码中使用
http://www.lryc.cn/news/2403935.html

相关文章:

  • SQL 基础入门
  • GitHub 趋势日报 (2025年06月05日)
  • 基于Flask框架的前后端分离项目开发流程是怎样的?
  • Delphi SetFileSecurity 设置安全描述符
  • rec_pphgnetv2完整代码学习(二)
  • 【计算机网络】Linux下简单的TCP服务器(超详细)
  • go中的接口返回设计思想
  • 最新Spring Security实战教程(十七)企业级安全方案设计 - 多因素认证(MFA)实现
  • html+css+js趣味小游戏~Cookie Clicker放置休闲(附源码)
  • 宝塔面板安装nodejs后,通过node -v获取不到版本号,报错node: command not found
  • SDC命令详解:使用set_propagated_clock命令进行约束
  • win32相关(消息Hook)
  • vue3单独封装表单校验函数
  • mysql 页的理解和实际分析
  • 分享一道力扣
  • 青少年编程与数学 01-011 系统软件简介 06 Android操作系统
  • 构建 MCP 服务器:第 2 部分 — 使用资源模板扩展资源
  • 【算法设计与分析】实验——汽车加油问题, 删数问题(算法实现:代码,测试用例,结果分析,算法思路分析,总结)
  • Ubuntu2404 下搭建 Zephyr 开发环境
  • 现代C++特性(一):基本数据类型扩展
  • 【C++进阶篇】C++11新特性(下篇)
  • 全生命周期的智慧城市管理
  • echarts柱状图实现动态展示时报错
  • Redis故障转移
  • STM32学习笔记:定时器(TIM)原理与应用(详解篇)
  • JAVA获取ES连接并查询所有数据
  • 408第一季 - 数据结构 - 线性表
  • 第23讲、Odoo18 邮件系统整体架构
  • 【QT面试题】(三)
  • DeepSeek09-open-webui使用