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

Java 中常见的数据结构

目录

1. List (列表)

2)ArrayList

2)LinkedList

2. Set (集合)

1)HashSet

2)TreeSet

3. Map (映射)

1)HashMap

2)TreeMap

4. Queue (队列)

1)LinkedList (也实现了Queue接口)

2)PriorityQueue

5. Stack (栈)

6.选择数据结构的原则

7.面试题:你能说出几种数据结构?它们都是基于什么实现的?

关键实现特点:


Java 集合框架提供了丰富的数据结构实现,以下我会介绍几种最常用的数据结构及其特性:

1. List (列表)

List 是有序集合,允许重复元素,可以通过索引访问元素。

2)ArrayList

  • 实现方式:基于动态数组

  • 特点

    • 随机访问快 (O(1))

    • 插入/删除中间元素慢 (O(n))

    • 自动扩容

  • 适用场景:频繁查询,较少插入删除

List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");

    2)LinkedList

    • 实现方式:基于双向链表

    • 特点

      • 插入/删除快 (O(1))

      • 随机访问慢 (O(n))

      • 实现了Deque接口

    • 适用场景:频繁插入删除,较少随机访问

    List<String> linkedList = new LinkedList<>();
    linkedList.add("C++");
    linkedList.addFirst("Go"); // 在头部添加

    2. Set (集合)

    Set 是不允许重复元素的无序集合。

    1)HashSet

    • 实现方式:基于哈希表

    • 特点

      • 插入/删除/查找快 (平均O(1))

      • 无序

    • 适用场景:需要快速判断元素是否存在

    Set<String> hashSet = new HashSet<>();
    hashSet.add("Apple");
    hashSet.add("Banana");

    2)TreeSet

    • 实现方式:基于红黑树

    • 特点

      • 元素自动排序

      • 操作时间复杂度 O(log n)

    • 适用场景:需要有序且不重复的元素集合

    Set<String> treeSet = new TreeSet<>();
    treeSet.add("Orange");
    treeSet.add("Apple"); // 自动排序

    3. Map (映射)

    Map 存储键值对,键不能重复。

    1)HashMap

    • 实现方式:基于哈希表

    • 特点

      • 快速访问 (平均O(1))

      • 无序

      • 允许null键和null值

    • 适用场景:快速查找键值对

    Map<String, Integer> hashMap = new HashMap<>();
    hashMap.put("Java", 1995);
    hashMap.put("Python", 1991);

    2)TreeMap

    • 实现方式:基于红黑树

    • 特点

      • 键自动排序

      • 操作时间复杂度 O(log n)

    • 适用场景:需要有序的键值对集合

    Map<String, Integer> treeMap = new TreeMap<>();
    treeMap.put("C++", 1983);
    treeMap.put("Go", 2009); // 按键排序

    4. Queue (队列)

    Queue 是先进先出(FIFO)的数据结构。

    1)LinkedList (也实现了Queue接口)

    Queue<String> queue = new LinkedList<>();
    queue.offer("First");
    queue.offer("Second");
    String first = queue.poll(); // 取出并移除第一个元素

    2)PriorityQueue

    • 特点

      • 元素按优先级出队

      • 基于堆实现

    • 适用场景:需要优先级处理的场景

    Queue<Integer> priorityQueue = new PriorityQueue<>();
    priorityQueue.offer(5);
    priorityQueue.offer(1); // 1会优先出队

    5. Stack (栈)

    Stack 是后进先出(LIFO)的数据结构。

    Deque<String> stack = new ArrayDeque<>(); // 推荐替代Stack类
    stack.push("First");
    stack.push("Second");
    String top = stack.pop(); // 取出并移除最后一个添加的元素

    6.选择数据结构的原则

    1. 考虑操作频率:频繁查询用ArrayList,频繁插入删除用LinkedList

    2. 是否需要排序:需要排序选择TreeSet/TreeMap

    3. 是否需要唯一性:需要唯一元素用Set

    4. 是否需要键值对:需要键值对用Map

    5. 线程安全需求:多线程环境考虑ConcurrentHashMap等并发集合

    7.面试题:你能说出几种数据结构?它们都是基于什么实现的?

    数据结构接口/类底层实现实现原理时间复杂度(平均)
    ArrayList动态数组基于Object[]数组实现,自动扩容(通常增长50%)查询O(1),增删O(n)
    LinkedList双向链表通过Node节点(Node<E> {E item; Node<E> next; Node<E> prev;})连接查询O(n),增删O(1)
    HashSetHashMap使用HashMap的key来存储元素,value统一为PRESENT静态对象增删查O(1)
    TreeSetTreeMap(红黑树)基于NavigableMap实现,元素作为TreeMap的key增删查O(log n)
    HashMap数组+链表+红黑树(JDK8+)哈希桶数组(table[]) + 链表(冲突时) + 红黑树(链表长度≥8时转换)增删查O(1)
    TreeMap红黑树基于红黑树(自平衡二叉查找树)实现,保持键的有序性增删查O(log n)
    LinkedHashMap哈希表+双向链表继承HashMap,增加双向链表维护插入/访问顺序增删查O(1)
    PriorityQueue二叉堆(数组实现)基于Object[]数组实现的小顶堆(可通过Comparator改变)插入O(log n),获取O(1)
    ArrayDeque循环数组使用Object[]数组+头尾指针(head/tail)实现双端操作增删查O(1)
    ConcurrentHashMap分段数组+CAS(JDK8前)JDK8前:Segment分段锁
    JDK8+:Node+CAS+synchronized
    增删查O(1)

    注:所有复杂度分析均基于理想情况,实际性能受哈希冲突、数据分布等因素影响。线程安全集合的实现细节在不同JDK版本中有显著差异。 

    关键实现特点:

    1. 动态扩容机制

      • ArrayList:默认初始容量10,扩容为原容量1.5倍

      • HashMap:默认初始容量16,负载因子0.75,扩容为2的幂次方

    2. 树化优化

      • HashMap在JDK8+中当链表长度≥8且桶数量≥64时,链表转为红黑树

      • 当红黑树节点≤6时,退化为链表

    3. 线程安全实现

      • Vector/Hashtable:方法级synchronized锁

      • ConcurrentHashMap:JDK8+使用CAS+synchronized细粒度锁

    4. 有序性保证

      • TreeSet/TreeMap:通过红黑树维持全序关系

      • LinkedHashMap:通过双向链表维护插入/访问顺序

    5. 特殊数据结构

      • PriorityQueue:基于堆(完全二叉树)实现,数组下标满足parent=(k-1)/2left=2k+1right=2k+2

     Java集合框架提供了丰富的选择,理解每种数据结构的特点才能写出高效的代码。

    相关文章:

  • 3、组件:魔法傀儡的诞生——React 19 组件化开发全解析
  • 【Python爬虫】详细入门指南
  • UNet深度学习实战遥感航拍图像语义分割
  • Java雪花算法
  • RabbitMQ的应用
  • mysql和mongodb
  • React 之 Redux 第三十二节 Redux 常用API及HOOKS,以及Redux Toolkit核心API使用详解
  • 62. 评论日记
  • java 实现文件编码检测的多种方式
  • Podman技术深度解剖:架构、原理与核心特性解析
  • cocos Spine资源及加载
  • JavaScript Map 对象深度解剖
  • HarmonyOS 第2章 Ability的开发,鸿蒙HarmonyOS 应用开发入门
  • 开源FMC 4路千兆网模块
  • Git 基本使用
  • 塑料瓶识别分割数据集labelme格式976张1类别
  • CASAIM与中国中车达成深度合作,助力异形大部件尺寸精准分析
  • TCPIP详解 卷1协议 四 地址解析协议
  • gcc/g++使用
  • agasa文件传输:内网文件互传的高效解决方案
  • 欠债七十万后,一个乡镇驿站站长的中年心事
  • 呼吸医学专家杜晓华博士逝世,终年50岁
  • 著名植物学家、园艺学家,国际植物园协会原主席贺善安逝世
  • 3年多来俄乌要首次直接对话?能谈得拢吗?
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结
  • 全国汽车以旧换新补贴申请量突破1000万份