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.rhkb.cn/news/13815.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-4使用次数有上限吗?一文了解使用规则

GPT-4的推出&#xff0c;让越来越多的用户开始体验其卓越的功能。无论是用于日常需求还是专业内容制作&#xff0c;GPT-4的应用范围广泛&#xff0c;获得了用户的广泛赞誉。但是&#xff0c;在具体使用过程中&#xff0c;不少用户发现自己似乎触碰到了GPT-4的使用上限&#xff…

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果&#xff0c;通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感&#xff0c;比如水的波动、反射、折射、透明等&#xff0c;可以让人感觉像真实的水一样流动闪耀。 核心特点就是&#xff1a; 动态波纹光学特…

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串&#xff08;String&#xff09;redis列表&#xff08;List&#xff09;redis哈希表&#xff08;Hash&#xff09;redis集合&#xff08;Set&#xff09;redis有序集合&#xff08;ZSet / SortedSet&…

Linux之安装docker

一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本&#xff0c;它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客&#xff0c;Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本&#xff0c;版本号为 14.1.2.0.0 &#xff0c;目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外&#xff0c;还增加了对 Java SE 17&#xff08;J…

feign 远程调用详解

在平常的开发工作中&#xff0c;我们经常需要跟其他系统交互&#xff0c;比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么&#xff0c;我们应该通过什么方式进行系统之间的交互呢&#xff1f;今天&#xff0c;简单来总结下 feign 的用法。 1&#xff1a;引入依…

解决 npm : 无法加载文件 D:\nodeJS\node_global\npm.ps1,因为在此系统上禁止运行脚本。

问题 在我将nodeJS从18更新到22之后&#xff0c;我发现在黑窗口运行npm run dev&#xff0c;可以成功启动项目&#xff0c;但是在Cursor的终端中却报如下错误&#xff1a; PS D:\DESKTOP\项目\vue-ems-admain> npm run dev npm : 无法加载文件 D:\Users\Download\nodeJS\no…

快速对QWen2.5大模型进行微调

先看看训练结果&#xff1a; 目录 前言什么是LLaMA-Factory&#xff1f;安装LLaMA-Factory准备数据集配置微调参数运行微调脚本评估和保存模型使用微调后的模型可视化微调大模型总结 前言 在当今人工智能领域&#xff0c;大模型&#xff08;如LLaMA、GPT等&#xff09;的微调…

深入理解linux中的文件(下)

目录 一、语言级缓冲区和内核级缓冲区 二、C语音中的FILE* fp fopen(“./file.txt”,"w"): 四、理解磁盘结构&#xff1a; 物理结构 逻辑结构 五、未被打开的文件&#xff1a; 六、更加深入理解inode编号怎么找到文件&#xff1a; 七、对路径结构进行…

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service 的…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码&#xff0c;发现登不上去 过滤掉了or&#xff0c;&#xff0c;当尝试了n种方法以后&#xff0c;最关键的是发现()居然也被过滤了 哈哈&#xff0c;那玩个淡&#xff0c; 再搜wp&#xff01;&#xff01; 当输入admin的时候&#xff0c;提示密码错误&#xff0…

Zenoh在工业物联网场景中的性能研究

论文标题 中文标题&#xff1a;Zenoh在工业物联网场景中的性能研究 英文标题&#xff1a;On the performance of Zenoh in Industrial IoT Scenarios 作者信息 Miguel Barn, Luis Diez, Mihail Zverev, Jos R. Jurez, Ramn Agero Miguel Barn&#xff1a;Ikerlan技术研究中心…

一次奇怪的空指针问题分析:事务、死锁与隐式回滚

最近我们在排查一个诡异的 空指针异常&#xff0c;整个分析过程可以说是跌宕起伏&#xff0c;最终的结论也颇具隐蔽性。今天就把这个问题分享出来&#xff0c;希望对大家有所帮助。 问题现象 在系统中&#xff0c;我们有 单据 B&#xff0c;它通过一个 关联 ID 字段与 上级单…

掌握API和控制点(从Java到JNI接口)_37 JNI开发与NDK 05

*.so的入口函数&#xff1a;JNI_OnLoad() 执行System.loadLibrary()函数时&#xff0c; VM会反向调用*.so里的JNI_OnLoad()函数。用途有二&#xff1a; 1. VM询问此*.so使用的JNI版本编号。 2. VM要求*.so做一些初期设定工作(Initialization)&#xff0c;例如登记<函…

MySQL数据库 (三)- 函数/约束/多表查询/事务

目录 一 函数 (一 字符串函数 (二 数值函数 (三 日期函数 (四 流程函数 二 约束 (一 概述 (二 约束演示 (三 外键约束 三 多表查询 (一 多表关系 1 一对多&#xff08;多对一&#xff09; 2 多对多 3 一对一 (二 多表查询概述 (三 内连接 1 查询语法 2 代码实…

EGO-Planner文章解读(一)——论文原理和算法实现

在fastplanner中&#xff0c;ESDF 对于评估梯度大小和方向至关重要。然而轨迹优化过程只覆盖了 ESDF 更新范围的非常有限的子空间&#xff0c;计算全图的ESDF是非常冗余的。除此之外&#xff0c;在建图的时候只能看见障碍物的表面&#xff0c;看不见障碍物的后面/内部&#xff…

C语言——深入理解指针(1)

深入理解指针 内存和地址内存究竟该如何理解编址呢&#xff1f; 指针变量和地址取地址操作符&#xff08;&&#xff09;指针变量和解引用操作符&#xff08;*&#xff09;指针变量如何拆解指针类型解引用操作符 指针变量的大小 指针变量类型的意义指针的解引用指针-整数voi…

人人皆可创建自己的AI应用:DigitalOcean GenAI平台正式上线

近日海外知名云平台DigitalOcean宣布&#xff0c;DigitalOcean GenAI 平台现已全面开放——这是一个强大且易用的解决方案&#xff0c;将彻底改变团队创建和部署人工智能应用的方式。 这一新平台延续了 DigitalOcean 普及 AI 开发的使命&#xff0c;让独立开发者到大型团队都能…

4.攻防世界 unseping

进入题目页面如下 直接给出源码&#xff0c;开始代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;方便调试和查看代码结构 highlight_file(__FILE__);// 定义一个名为 ease 的类 class ease {// 定义私有属性 $method&#xff0c;用于存储要调用的方法名priv…

Llama最新开源大模型Llama3.1

Meta公司于2024年7月23日发布了最新的开源大模型Llama 3.1&#xff0c;这是其在大语言模型领域的重要进展。以下是关于Llama 3.1的详细介绍&#xff1a; 参数规模与训练数据 Llama 3.1拥有4050亿&#xff08;405B&#xff09;参数&#xff0c;是目前开源领域中参数规模最大的…