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

java手动实现常见数据结构

在 Java 中,常用的数据结构可以通过 集合框架(Collections Framework) 实现,也可以手动实现。以下是常见数据结构及其特点,以及对应的 Java 实现示例:


1. 数组(Array)

  • 特点:固定大小、内存连续、随机访问高效。
  • 用途:存储固定数量的元素。
  • Java 实现
    int[] array = new int[5]; // 静态数组
    array[0] = 10;
    

2. 动态数组(ArrayList)

  • 特点:基于数组实现,支持动态扩容,随机访问高效(O(1)),插入/删除低效(O(n))。
  • 用途:需要频繁随机访问的场景。
  • Java 实现
    import java.util.ArrayList;
    ArrayList<Integer> list = new ArrayList<>();
    list.add(10);        // 添加元素
    int value = list.get(0); // 访问元素
    

3. 链表(LinkedList)

  • 特点:基于双向链表实现,插入/删除高效(O(1)),随机访问低效(O(n))。
  • 用途:频繁插入/删除的场景。
  • Java 实现
    import java.util.LinkedList;
    LinkedList<Integer> linkedList = new LinkedList<>();
    linkedList.add(10);          // 添加元素
    linkedList.addFirst(5);      // 头部插入
    int first = linkedList.getFirst(); // 访问头部元素
    

4. 栈(Stack)

  • 特点:后进先出(LIFO),支持 pushpop 操作。
  • 用途:函数调用栈、表达式求值。
  • Java 实现(推荐使用 Deque):
    import java.util.ArrayDeque;
    ArrayDeque<Integer> stack = new ArrayDeque<>();
    stack.push(10); // 压栈
    int top = stack.pop(); // 弹栈
    

5. 队列(Queue)

  • 特点:先进先出(FIFO),支持 offerpoll 操作。
  • 用途:任务调度、广度优先搜索(BFS)。
  • Java 实现
    import java.util.Queue;
    import java.util.LinkedList;
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(10); // 入队
    int head = queue.poll(); // 出队
    

6. 哈希表(HashMap)

  • 特点:基于哈希表实现,键值对存储,查找高效(平均 O(1)),无序。
  • 用途:快速查找、去重。
  • Java 实现
    import java.util.HashMap;
    HashMap<String, Integer> map = new HashMap<>();
    map.put("Alice", 25); // 添加键值对
    int age = map.get("Alice"); // 查找
    

7. 树(TreeSet/TreeMap)

  • 特点:基于红黑树实现,元素自动排序(按自然顺序或自定义比较器),查找/插入/删除时间复杂度为 O(log n)。
  • 用途:需要有序存储的场景。
  • Java 实现
    import java.util.TreeSet;
    TreeSet<Integer> treeSet = new TreeSet<>();
    treeSet.add(10);
    treeSet.add(5); // 自动排序为 [5, 10]
    

8. 堆(PriorityQueue)

  • 特点:基于堆(默认最小堆)实现,元素按优先级排序。
  • 用途:任务调度、求 Top K 问题。
  • Java 实现
    import java.util.PriorityQueue;
    PriorityQueue<Integer> heap = new PriorityQueue<>();
    heap.offer(10);
    heap.offer(5); // 堆顶为 5
    int min = heap.poll(); // 弹出最小值 5
    

9. 图(Graph)

  • 特点:节点和边的集合,通常通过邻接表或邻接矩阵实现。
  • 用途:社交网络、路径规划。
  • Java 实现(邻接表):
    import java.util.*;
    class Graph {
        private Map<Integer, List<Integer>> adjacencyList = new HashMap<>();
        
        public void addEdge(int src, int dest) {
            adjacencyList.computeIfAbsent(src, k -> new ArrayList<>()).add(dest);
            adjacencyList.computeIfAbsent(dest, k -> new ArrayList<>()).add(src); // 无向图
        }
    }
    

10. 集合(Set)

  • 特点:不允许重复元素。
  • Java 实现HashSetTreeSet):
    import java.util.HashSet;
    HashSet<String> set = new HashSet<>();
    set.add("Apple");
    set.add("Apple"); // 重复元素会被忽略
    

11. 双向队列(Deque)

  • 特点:支持两端插入和删除。
  • 用途:滑动窗口、双端操作。
  • Java 实现
    import java.util.ArrayDeque;
    ArrayDeque<Integer> deque = new ArrayDeque<>();
    deque.addFirst(10);
    deque.addLast(20);
    int first = deque.removeFirst();
    

12. 自定义链表(手动实现)

class Node {
    int data;
    Node next;
    Node(int data) {
        this.data = data;
        this.next = null;
    }
}

class LinkedList {
    Node head;
    
    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }
}

总结

Java 提供了丰富的内置数据结构(通过 java.util 包),开发者可以根据需求选择合适的结构:

  • 快速查找HashMapHashSet
  • 有序存储TreeMapTreeSet
  • 高效插入/删除LinkedListArrayDeque
  • 动态扩容ArrayList
  • 优先级处理PriorityQueue

掌握这些数据结构的特点和使用场景,可以显著提升代码效率和可维护性!


http://www.kler.cn/a/539460.html

相关文章:

  • python--sqlite
  • 『Apisix进阶篇』结合Consul作服务发现实战演练
  • C++字符串相关内容
  • Ai无限免费生成高质量ppt教程(deepseek+kimi)
  • 【C/C++】每日温度 [ 栈的应用 ] 蓝桥杯/ACM备赛
  • flask实现用户名查重,重复的用户名阻止注册,以及如何优化
  • 零基础入门AI:如何使用ollama本地部署DeepSeek 开源大模型
  • B+树原理详解及C语言实现
  • 如何使用deepseek开发一个翻译API
  • 韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系
  • 如何使用python制作一个天气预报系统
  • 工业物联网平台-视频识别视频报警新功能正式上线
  • 【kafka实战】06 kafkaTemplate java代码使用示例
  • 语义分割文献阅读——SETR:使用Transformer从序列到序列的角度重新思考语义分割
  • ProcessingP5js游戏掉落的恐龙蛋
  • 如何在Vscode中接入Deepseek
  • 基于房价预测的线性回归算法原理与python实现(附源代码)
  • JVM常见命令
  • 通过C模块中的Python API访问数组的数组
  • Playwright 与 Selenium 的关系
  • java基础5(黑马)
  • 【kafka实战】05 Kafka消费者消费消息过程源码剖析
  • Kotlin 2.1.0 入门教程(十一)for、while、return、break、continue
  • 捕获一只比特币挖矿木马
  • vllm 部署 qwen2.5 报错2.5 报错404 已解决
  • java基础语法中阶