Java 中常见的数据结构

news2024/12/23 18:57:43

数据结构简介

数据结构是计算机科学中用于组织和存储数据的一种方式或方法。它定义了不同数据元素之间的关系,以及对这些数据元素进行操作和访问的规则和技术。

数据结构可以用来描述问题的抽象模型,并提供处理该问题的操作和算法。它可以通过逻辑和物理两个层面来表示。逻辑上,数据结构关注数据之间的逻辑关系,如线性、非线性、层次等。物理上,数据结构关注数据在计算机内存中的存储方式和组织结构。

数据结构作用

  1. 提高算法效率:数据结构是算法的基础,选择合适的数据结构可以显著提升算法的效率。通过学习数据结构,你将能够了解各种数据结构的特性、操作和适用场景,从而能够使用最合适的数据结构解决实际问题,优化算法的时间复杂度和空间复杂度。

  2. 提供问题建模方法:许多实际问题可以通过合适的数据结构进行更好的建模和表示。学习数据结构可以帮助你理解问题背后的本质,并将其转化为适当的抽象表示形式。通过建立正确的数据结构模型,可以更容易地设计和实现解决方案。

  3. 提升代码质量和可维护性:良好的数据结构设计可以提高代码的质量和可维护性。使用适当的数据结构可以使代码更加清晰、简洁,并减少错误和bug的出现。此外,合理选择和使用数据结构可以使代码更易于阅读、理解和扩展。

  4. 促进问题解决能力:学习数据结构可以培养你的问题解决能力和分析能力。不同的问题可能需要使用不同的数据结构来解决,在实践中掌握多种数据结构可以拓宽你的解决问题的思路和能力,使你能够更加灵活地应对各种挑战。

  5. 为学习其他计算机科学领域奠定基础:数据结构是计算机科学的核心概念之一,并与其他领域密切相关。在学习数据结构的过程中,你将接触到计算机科学中的基本概念、算法设计和优化技巧等内容,为进一步深入学习计算机科学提供了坚实的基础。

总而言之,学习数据结构有助于你提升算法效率、解决实际问题、改进代码质量、培养问题解决能力,并为学习其他计算机科学领域打下基础。无论你是从事软件开发、数据分析还是人工智能等领域,掌握数据结构都是非常重要的。

数据结构类型

在这里插入图片描述

  1. 数组(Array):
  • 数组是一种线性数据结构,可以存储相同类型的元素。数组具有固定长度,并且可以通过索引值快速访问和修改元素。适用于需要按索引访问元素的场景。

  • 使用范围:适用于需要按索引访问元素的场景。

  • 代码示例:

    int[] numbers = new int[5]; // 声明一个长度为5的整数数组
    numbers[0] = 10;
    numbers[1] = 20;
    // ...
    
  1. 列表(List):
  • List是一个有序的集合,允许重复元素。ArrayList:基于数组实现的动态数组,支持快速随机访问和动态增删操作。LinkedList:基于链表实现的列表,支持高效的插入和删除操作。

  • 使用范围:用于存储一组有序的元素,可以动态增删。

  • 代码示例:

    List<String> names = new ArrayList<>();
    names.add("Alice");
    names.add("Bob");
    names.add("Charlie");
    // ...
    String firstPerson = names.get(0);
    
  1. SparseArray(稀疏数组):
  • SparseArray是Android特有的数据结构,用于存储大部分元素为默认值(例如0)的稀疏数组。它使用了两个数组来实现,一个存储非默认值的元素索引,另一个存储对应的元素值。

  • 使用范围:适用于存储稀疏数据,可以节省内存空间。

  • 代码示例:

    SparseArray<String> sparseArray = new SparseArray<>();
    sparseArray.put(1, "A");
    sparseArray.put(3, "B");
    sparseArray.put(5, "C");
    // ...
    String element = sparseArray.get(3);
    
  1. Collection(集合):
  • 使用范围:是所有集合类的根接口,定义了对集合进行基本操作的通用方法。

  • 代码示例:

    Collection<String> collection = new ArrayList<>();
    collection.add("A");
    collection.add("B");
    collection.add("C");
    // ...
    boolean containsB = collection.contains("B");
    
  1. 集合(Set):
  • 集合是一种用于存储唯一元素的数据结构,没有重复值。可以用来检查元素是否存在,进行交集、并集和差集等操作。

  • 使用范围:用于存储一组唯一的元素,无序。

  • 代码示例:

    Set<Integer> numbers = new HashSet<>();
    numbers.add(10);
    numbers.add(20);
    numbers.add(30);
    // ...
    boolean containsTwenty = numbers.contains(20);
    
  1. 映射(Map):
  • 映射是一种将键映射到值的数据结构。Java中的Map接口及其实现类(如HashMap和TreeMap)提供了键值对的存储和检索功能。

  • 使用范围:适用于存储键值对的场景,每个键都是唯一的。

  • 代码示例:

    Map<String, Integer> scores = new HashMap<>();
    scores.put("Alice", 90);
    scores.put("Bob", 80);
    scores.put("Charlie", 95);
    // ...
    int aliceScore = scores.get("Alice");
    
  1. 栈(Stack):
  • 栈是一种后进先出(LIFO)的数据结构,类似于一叠盘子。只有栈顶的元素可见和可访问,其他元素需要先移除栈顶元素才能访问到。

  • 使用范围:用于实现后进先出(LIFO)的数据结构。

  • 代码示例:

    Stack<String> stack = new Stack<>();
    stack.push("A");
    stack.push("B");
    stack.push("C");
    // ...
    String top = stack.pop();
    
  1. 队列(Queue):
  • 队列是一种先进先出(FIFO)的数据结构,类似于排队等待的人群。新元素在队尾添加,而从队头移除元素。

  • 使用范围:用于实现先进先出(FIFO)的数据结构。

  • 代码示例:

    Queue<String> queue = new LinkedList<>();
    queue.offer("A");
    queue.offer("B");
    queue.offer("C");
    // ...
    String front = queue.poll();
    
  1. 链表(LinkedList):
  • 链表是一种动态数据结构,用于存储和操作元素的集合。元素通过节点连接在一起,每个节点包含一个数据元素和指向下一个节点的引用。

  • 使用范围:用于实现动态插入和删除元素的线性数据结构。

  • 代码示例:

    LinkedList<String> linkedList = new LinkedList<>();
    linkedList.add("A");
    linkedList.add("B");
    linkedList.add("C");
    // ...
    String firstElement = linkedList.getFirst();
    
  1. 树(Tree):
  • 树是一种分层的数据结构,由节点和边组成。每个节点都有零个或多个子节点,除了根节点外,每个节点都有且只有一个父节点。

  • 使用范围:用于表示具有层级关系的数据结构,如二叉树、平衡树等。

  • 代码示例:

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
    
        public TreeNode(int val) {
            this.val = val;
        }
    }
    
    TreeNode root = new TreeNode(1); // 创建根节点
    root.left = new TreeNode(2);
    root.right = new TreeNode(3);
    // ...
    
  1. 图(Graph):
  • 图是由节点和边组成的非线性数据结构,用于表示物体之间的关系。图可以是有向的或无向的,可以包含环。

  • 使用范围:用于表示节点之间的关系,适用于复杂的网络结构。

  • 代码示例:

    class Graph {
        int vertices; // 节点数
        List<List<Integer>> adjList;
    
        public Graph(int vertices) {
            this.vertices = vertices;
            adjList = new ArrayList<>(vertices);
            for (int i = 0; i < vertices; i++) {
                adjList.add(new ArrayList<>());
            }
        }
    
        public void addEdge(int src, int dest) {
            adjList.get(src).add(dest);
            adjList.get(dest).add(src);
        }
    }
    
    Graph graph = new Graph(4); // 创建包含4个节点的图
    graph.addEdge(0, 1);
    graph.addEdge(1, 2);
    // ...
    
  1. 堆(Heap):
  • Heap是一种完全二叉树的数据结构,具有特殊的性质。PriorityQueue:基于堆实现的优先级队列,可以根据元素的优先级进行插入和删除。

  • 使用范围:用于高效地找到最大或最小元素。

  • 代码示例:

    PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    minHeap.offer(5);
    minHeap.offer(3);
    minHeap.offer(7);
    // ...
    int smallest = minHeap.poll();
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wpf增加系统托盘图标

使用系统托盘&#xff0c;可以为用户提供一个简便快捷的操作习惯。 wpf中增加系统托盘图标有2种 第一种&#xff0c;使用Hardcodet.NotifyIcon.Wpf开源组件 1.建立一个wpf程序 2.安装Hardcodet.NotifyIcon.Wpf 3.增加图片 图片选择资源&#xff0c;否则获取不到路径 4.界面…

TypeScript - 函数(上)

目录 1、介绍 2、函数类型表达式 3、呼叫签名 4、构造签名 5、泛型函数 6、推论 7、约束 8、使用约束值 9、指定类型参数 1、介绍 函数是JavaScript应用程序的基础。 它帮助你实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 在TypeScript里&#xff0c…

Linux——进程的概念

task_struct task_struct 是linux下管理进程的结构&#xff0c;称为PCB&#xff0c;进程控制块。linux所有的指令本质上都是一个进程。进程 task_struct 进程的数据、代码、可执行程序&#xff0c;有属性、有内容。 进程是系统的工作单元。系统由多个进程组成&#xff0c;包…

Linux定时任务--crontab

linux内置了cron进程&#xff0c;cron搭配shell脚本&#xff0c;就可以完成特定的需求&#xff0c;有定时任务的效果。 crontab指令即cron table的简写&#xff0c;相关的配置文件目录如下&#xff1a; /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务&#xf…

论文笔记--On the Sentence Embeddings from Pre-trained Language Models

论文笔记--On the Sentence Embeddings from Pre-trained Language Models 1. 文章简介2. 文章概括3 文章重点技术3.1 BERT模型的语义相似度能力分析3.2 Anistropic各向异性3.3 BERT-flow3.4 Flow-based model 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#x…

树莓派Pico|RP2040简介|PINOUT|点灯示例

文章目录 一、Pico简介&#xff1a;二、几个比较重要的git仓库&#xff1a;三、使用前必读&#xff1a;四、PINOUT五、点灯一、如何安装固件二.安装Thonny编程环境配置三、点亮板载的LED灯Pico点亮板载LED灯的代码&#xff1a;PicoW点亮板载LED灯的代码&#xff1a; 一、Pico简…

[LeetCode周赛复盘] 第 107 场双周赛20230624

[LeetCode周赛复盘] 第 107 场双周赛20230624 一、本周周赛总结6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6895. 构造最长的新字符串1. 题目描述2. 思路分析3. 代码实现 6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6468. 统计没有收到请求…

Linux系统之部署Dailynotes个人笔记管理工具

Linux系统之部署Dailynotes个人笔记管理工具 一、Dailynotes介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查本地yum仓库状态 四、部署Node.js 环境4.1 下载Node.js安装包4.2 解压Node.js安装包4…

ThreadPoolExecutor的应用

前面描述的线程池的创建方式大都是Executors类中创建出来&#xff0c;基于ThreadPoolExecutor去new出来实现的。 我们为什么要自定义线程池 在线程池ThreadPoolExecutor中提供了7个参数&#xff0c;都作为非常核心的属性&#xff0c;在线程池去执行任务的时候&#xff0c;每个…

Nginx-Goaccess(实时日志服务)

goaccess的功能 1、使用webscoket协议传输&#xff08;双向传输协议&#xff09;2、基于终端的快速日志分析器3、通过access.log快速分析和查看web服务的统计信息、PV、UV4、安装简单、操作简易、界面炫酷5、按照日志统计访问次数、独立访客数量、累计消耗的带宽6、统计请求次…

物理引擎--Open Dynamics Engine(ODE)

物理引擎--Open Dynamics Engine--ODE 1 介绍1.1 概述1.2 代码1.3 wiki1.4 特征1.5 许可 2 安装使用3 概念3.1 背景3.2 刚体3.2.1 岛屿和禁用实体 3.3 一体化3.4 积分器3.5 关节和约束3.6 关节组3.7 关节误差和误差减少参数 (ERP) Joint error and the Error Reduction Paramet…

Scala函数式编程【从基础到高级】

目录 函数基础 基本语法 函数参数 函数至简原则 至简原则细节 函数高级 高阶函数 函数的3种高阶用法&#xff1a; 1、函数作为值传递 2、函数作为参数传递 匿名函数作参数传递 3、函数作为返回值传递 匿名函数的至简规则 高阶函数的应用 案例-将数组中的元素全部…

【LeetCode】 动态规划 刷题训练(三)

文章目录 931. 下降路径最小和题目解析状态转移方程完整代码 64. 最小路径和题目解析状态转移方程完整代码 174. 地下城游戏题目解析状态转移方程完整代码 931. 下降路径最小和 点击查看&#xff1a;下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找…

chatgpt赋能python:Python搜题软件:为你量身定制的智能搜索助手

Python搜题软件&#xff1a;为你量身定制的智能搜索助手 随着互联网的普及&#xff0c;我们每天需要面对海量的信息&#xff0c;其中包含了我们所需要的一切答案。但是&#xff0c;如何快速而准确地找到这些答案呢&#xff1f;这时候&#xff0c;一款智能化的搜题软件就非常有…

【不推荐】win 安装 rust 1.70 (MSVC)

目录 一、下载二、安装三、配置环境变量四、检查是否安装成功五、参考文章 一、下载 官网地址&#xff1a;https://www.rust-lang.org/zh-CN/ https://forge.rust-lang.org/infra/other-installation-methods.html 历史版本下载地址&#xff1a; 二、安装 注意&#xff1a;安…

Redis:redis基于各大实战场景下的基本使用

文章目录 前言String 命令实战1.业务缓存对应redis中的指令伪代码 2.分布式锁对应redis中的指令伪代码 3.限流对应redis中的指令伪代码 List 命令实战1.提醒功能对应Redis中的指令伪代码 2.热点列表对应Redis中的指令伪代码 Hash 命令实战1.用户资料缓存对应redis中的指令伪代码…

RabbitMQ学习笔记(尚硅谷)

文章目录 一. 消息队列1. 定义2. 作用2.1 流量消峰2.2 应用解耦2.3 异步处理 3. 分类4. MQ的选择5. RabbitMQ5.1 概念5.2 四大概念5.3 六大模式5.4 RabbitMQ 工作原理5.5 安装 6. 代码实现 二. Hello World (简单模式)1. 生产者代码2. 消费者代码 三. Work Queues (工作队列模式…

OUC编译原理实验报告 实验5:用Yacc设计语法分析器1 实验6:用Yacc设计语法分析器2

编译原理实验报告 实验5&#xff1a;用Yacc设计语法分析器1 实验6&#xff1a;用Yacc设计语法分析器2 中国海洋大学编译原理实验2023春 仅供同学参考思路 请勿直接抄袭 否则可能喜提0分 目录 文章目录 编译原理实验报告目录一.实验目的二.实验内容实验5实验6 三.实验要求实…

RISCV Reader笔记_2 RV32I

RV32I 完整的RV32I指令集可以用下面的式子中出现单词的首字母表示&#xff1a; 比如这一条&#xff1a; set less than {immediate} {unsigned} 也就是slt slti sltu sltiu这4个指令。 RISCV指令格式如下。R 寄存器操作&#xff0c;I 立即数或load访存&#xff0c;S store访…

C51单片机期末复习第八章单片机接口技术

一 总线&#xff1a; 传送同类信息的连线 三总线&#xff1a; 地址总线AB&#xff0c;数据总线DB,控制总线CB 目录(ppt给的没啥用&#xff0c;乱还不全)&#xff1a; 8.1 单片机的系统总线 8.2 简单并行I/O口扩展 8.3 可编程并行I/O口扩展 8.4 D/A转换与DAC0832应用 8…