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

Java 常用数据结构详解

一、线性数据结构

1. 数组 (Array)
  • 特点:连续内存空间,固定长度,通过索引快速访问。
  • 使用场景:数据量固定且需要频繁随机访问。
  • 示例
    int[] arr = new int[5]; 
    arr[0] = 10; // O(1)访问
    
2. ArrayList
  • 特点:基于动态数组实现,自动扩容,线程不安全。
  • 时间复杂度
    • 查询:O(1)
    • 插入/删除:末尾 O(1),中间 O(n)
  • 示例
    List<String> list = new ArrayList<>();
    list.add("Java"); // 添加元素
    list.get(0);      // 获取元素
    
3. LinkedList
  • 特点:双向链表实现,内存不连续,支持快速插入/删除。
  • 时间复杂度
    • 查询:O(n)
    • 插入/删除:头部/尾部 O(1),中间 O(n)
  • 示例
    LinkedList<Integer> linkedList = new LinkedList<>();
    linkedList.addFirst(1); // 头部插入
    linkedList.removeLast(); // 尾部删除
    

二、集合框架 (Collection)

1. HashSet
  • 特点:基于 HashMap 实现,无序,元素唯一。
  • 时间复杂度:插入、删除、查找均为 O(1)
  • 示例
    Set<String> set = new HashSet<>();
    set.add("A");
    set.contains("A"); // 判断存在性
    
2. TreeSet
  • 特点:基于红黑树实现,元素有序(自然顺序或自定义排序)。
  • 时间复杂度:插入、删除、查找均为 O(log n)
  • 示例
    TreeSet<Integer> treeSet = new TreeSet<>();
    treeSet.add(3);
    treeSet.first(); // 最小元素
    
3. LinkedHashSet
  • 特点:继承 HashSet,维护插入顺序的链表。
  • 时间复杂度:与 HashSet 相同。
  • 示例
    Set<String> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add("B");
    linkedHashSet.add("A"); // 保持插入顺序
    

三、映射结构 (Map)

1. HashMap
  • 特点:数组+链表/红黑树,键唯一,允许 null 键/值,线程不安全。
  • 时间复杂度:插入、删除、查找 O(1)(理想情况下)。
  • 示例
    Map<String, Integer> map = new HashMap<>();
    map.put("Key", 100);
    map.get("Key"); // 获取值
    
2. LinkedHashMap
  • 特点:继承 HashMap,维护插入顺序或访问顺序。
  • 使用场景:需要有序的键值对(如 LRU 缓存)。
  • 示例
    LinkedHashMap<String, Integer> linkedMap = new LinkedHashMap<>();
    linkedMap.put("A", 1);
    linkedMap.get("A"); // 保持插入顺序
    
3. TreeMap
  • 特点:基于红黑树,键有序(自然顺序或自定义 Comparator)。
  • 时间复杂度:插入、删除、查找 O(log n)
  • 示例
    TreeMap<String, Integer> treeMap = new TreeMap<>();
    treeMap.put("Z", 26);
    treeMap.firstKey(); // 最小键
    
4. ConcurrentHashMap
  • 特点:线程安全的 HashMap,分段锁提高并发性能。
  • 使用场景:高并发环境下的键值存储。
  • 示例
    ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
    concurrentMap.put("K", "V");
    

四、队列与栈

1. Queue 接口
  • 实现类LinkedListPriorityQueueArrayDeque
  • 常用方法
    • add()/offer():入队
    • remove()/poll():出队
    • element()/peek():查看队首
  • 示例
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(1); // 入队
    queue.poll();    // 出队
    
2. PriorityQueue
  • 特点:基于堆实现,元素按优先级排序。
  • 时间复杂度:插入/删除 O(log n)
  • 示例
    PriorityQueue<Integer> pq = new PriorityQueue<>();
    pq.offer(5);
    pq.poll(); // 取出最小元素
    
3. 栈 (Stack)
  • 实现类:官方推荐使用 Deque 替代 Stack 类。
  • 示例
    Deque<Integer> stack = new ArrayDeque<>();
    stack.push(1); // 压栈
    stack.pop();   // 弹栈
    

五、性能对比与选择指南

数据结构特点适用场景
ArrayList快速随机访问,增删慢频繁查询,数据量固定或变化小
LinkedList增删快,查询慢频繁插入/删除,实现队列/栈
HashMap快速键值存取,无序高频键值操作,无需顺序
TreeMap键有序,速度较慢需要排序或范围查询
HashSet快速去重,无序元素唯一性校验
ConcurrentHashMap线程安全,高并发多线程环境下的共享Map

六、注意事项

  1. 线程安全

    • 单线程环境:优先使用 ArrayListHashMap
    • 多线程环境:使用 ConcurrentHashMapCopyOnWriteArrayList
  2. 遍历安全

    • 使用迭代器时避免直接修改集合(ConcurrentModificationException)。
  3. 初始容量

    • ArrayListHashMap 等预设初始容量(如 new ArrayList<>(100))避免频繁扩容。
http://www.dtcms.com/a/109357.html

相关文章:

  • Java8 到 Java21 系列之 Stream API:数据处理的新方式(Java 8)
  • Node.js 安装与配置全攻略:从入门到高效开发
  • 做题记录:和为K的子数组
  • 二极管正负极区分
  • Mermaid 语法教程
  • kali中vmtools失效用不了解决方法
  • Leetcode 857 -- 贪心 | 数学
  • 【C语言】整数和浮点数在内存中的存储
  • 使用pkexec 和其策略文件安全提权执行外部程序
  • linux文件上传下载lrzsz
  • LangChain核心解析:掌握AI开发的“链“式思维
  • 【KMP】P4391 [BalticOI 2009] Radio Transmission 无线传输|普及+
  • 蜜蜡是什么?蜜蜡与琥珀的区别以及蜜蜡的收藏价值一览
  • 《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库
  • 一篇关于Netty相关的梳理总结
  • 修复SSL证书链不完整问题certificate verify failed unable to get local issuer certificate
  • Java学习总结-io缓冲流
  • [MySQL初阶]MySQL表的操作
  • 【服务日志链路追踪】
  • C语言--回文字符串
  • Spark中排序--前缀排序prefixSort
  • 【人工智能之大模型】在Transformer中,同一个词可以有不同的注意力权重嘛?为什么
  • 鸿蒙NEXT开发缓存工具类(ArkTs)
  • 华为云 云化数据中心 CloudDC | 架构分析与应用场景
  • Java学习总结-Flie-IO流
  • 解决Ubuntu文件夹锁标记
  • 【youcans论文精读】弱监督深度检测网络(Weakly Supervised Deep Detection Networks)
  • Spring Boot 3.4.3 整合 Quartz 定时任务
  • Onloyoffice公式 从指定的数据范围中筛选出符合条件的数据行 放到别的sheet里面
  • Ubuntu 安装eBPF编译环境。