Java数据结构与集合原码

数据结构与集合原码

文章目录

  • 数据结构与集合原码
    • 1. 数据结构基本概念
      • 1.1 概念
      • 1.2 数据结构的研究对象
    • 2. 常见存储结构
      • 2.1 数组
      • 2.2 链表
        • 2.2.1 单向链表
        • 2.2.2 双向链表
      • 2.3 二叉树
      • 2.4 栈(stack)
      • 2.5 队列
    • 3. 二叉树
      • 3.1 二叉树的遍历
      • 3.2 经典二叉树
    • 4. List实现类源码分析
      • 4.1 ArrayList
      • 4.2 LinkedList
      • 4.3 启示
    • 5. HashMap实现类源码分析
      • 5.1 jdk8与jdk7中的不同

1. 数据结构基本概念

1.1 概念

  • 数据结构:一种程序设计优化的方法论,研究数据的“逻辑结构” 和 “物理结构” 以及它们之间的相互关系,并对这种结构定义相应的”运算“。目的是加快程序的执行速度、减少内存占用的空间

1.2 数据结构的研究对象

  • 研究对象1:逻辑结构
    • 集合结构
    • 线性结构:一对一
    • 树形结构:一对多
    • 图形结构:多对多
  • 研究对象2:物理结构(存储结构)
    • 顺序结构
    • 链式结构
    • 索引结构
    • 散列结
  • 研究对象3:相关算法操作
    • 分配资源,建立结构,释放资源
    • 插入和删除
    • 获取和遍历
    • 修改和排序

2. 常见存储结构

2.1 数组

  • 所有数据存储在一个连续的空间中,紧密排布,不能有间隔

2.2 链表

  • 链表中基本单位:节点(Noad)
2.2.1 单向链表

在这里插入图片描述

class Node{Object data;Node next;public Node(Object data){this.data = data;}
}//创建对象
Node node1 = new Node("AA");
Node node2 = new Node("BB");
Node node3 = new Node("CC");
node1.next = node2;
node2.next = node3;
2.2.2 双向链表

在这里插入图片描述

class Node{Node pre;Object data;Node next;public Node(Object data){this.data = data;}public Node(Node pre, Object data, Node next){this.pre = pre;this.data = data;this.next = next;}
}//创建对象
Node node1 = new Node(null, "AA", null);
Node node2 = new Node(node1, "BB", null);
Node node3 = new Node(node2, "CC", null);
node1.next = node2;
node2.next = node3;

2.3 二叉树

在这里插入图片描述

class TreeNode{TreeNode left;Object data;TreeNode right;public TreeNode(Object data){this.data = data;}public TreeNode(TreeNode left, Object data, TreeNode right){this.left = left;this.data = data;this.right = right;}
}//创建对象
TreeNode node1 = new TreeNode(null, "AA", null);
TreeNode leftNode = new TreeNode(null, "BB", null);
TreeNode rightNode = new TreeNode(null, "CC", null);
node1.left = leftNode;
node1.right = rightNode;

2.4 栈(stack)

  • 先进后出

  • 特点:

    • 栈是抽象数据结构(ADT)
    • 可以用数组或链表构建
class Stack{Object[] values;int size;public Stack(int length){values = new Object[length];}//入栈public void push(Object o){if(size >= values.length){throw new RuntimeException("栈空间已满,入栈失败");}values[size] = o;size++;}//出栈public Object pop(){if(size <= 0){throw new RuntimeException("栈空间已空,出栈失败");}Object obj = values[size-1];values[size-1] = null;size--;return obj;}
}

2.5 队列

  • 先进先出
  • 特点:
    • 栈是抽象数据结构(ADT)
    • 可以用数组或链表构建

3. 二叉树

3.1 二叉树的遍历

在这里插入图片描述

  • 先序遍历(根,左,右):A,B,D,H,I,E,C,F,G
  • 中序遍历(左,根,右):H,D,I,B,E,A,F,C,G
  • 后序遍历(左,右,根):H,I,D,E,B,F,G,C,A

3.2 经典二叉树

  • 二叉排序树(BST)

    • 左节点的数始终小于根节点,右节点的数始终大于根节点

      此时进行中序遍历,会得到有序集合

  • 平衡二叉树(AVL) —— 满足是二叉排序树的条件下,具有以下特点

    • 左右两个子树的高度差的绝对值不超过1
  • 红黑树 —— 满足是二叉排序树的条件下,具有以下特点

    • 每个节点是红色/黑色
    • 根节点是黑色
    • 每个叶子结点是黑色
    • 每个红色节点的两个子节点都是黑色
    • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

4. List实现类源码分析

4.1 ArrayList

  • jdk7.0:类似(饿汉式)

    //创建对象:底层初始化数组,数组长度为10:Object[] elementData = new Object[10];
    ArrayList list = new ArrayList();//当添加元素长度达到10时,会扩容为原来的1.5倍,并将原来的数组复制到新的数组中
    
  • jdk8.0:类似(懒汉式)

    //创建对象:底层初始化数组:Object[] elementData = new Object[]{};
    ArrayList list = new ArrayList();
    

4.2 LinkedList

  • 不存在扩容问题

4.3 启示

  • ArrayList:查找和添加效率高,时间复杂度O(1)

    ​ 删除和插入效率低,时间复杂度O(n)

  • LinkedList:查找和添加效率低,时间复杂度O(n)

    ​ 删除和插入效率高,时间复杂度O(1)

5. HashMap实现类源码分析

5.1 jdk8与jdk7中的不同

  • jdk8中,创建HashMap实例后,底层没有初始化table数组。当首次添加(key, value)时,进行判断,若发现table尚未初始化,则对数组进行初始化
  • jdk8中,HashMap底层定义了Node内部类,替换jdk7中的Entry内部类。意味着,创建的数组是Node[]
  • jdk8中,如果当前(key, value)经过一系列判断之后,可以添加到数组角标i中。——》如果此时 i 位置上有元素。在idk7中是将新的(key, value)指向已有的旧的元素(头插法)。而在jdk8中是旧的元素指向新的元素(尾插法)———— “七上八下”

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

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

相关文章

redis和redisson实现分布式锁

redis和redisson实现分布式锁 基于setnx命令的分布式锁基于set命令的分布式锁redission看门狗分布式锁 基于setnx命令的分布式锁 1. 加锁 使用 Redis 实现分布式锁&#xff0c;最直接的想法是利用 setnx 和 expire 命令实现加锁。 在 Redis 中&#xff0c;setnx 是「set if …

1.排列数组奇数在前偶数在后

文章目录 大家好&#xff0c;我是晓星航。今天为大家带来的是 排列数组奇数在前偶数在后 相关的讲解&#xff01;&#x1f600; public static void swap(int[] array) {int left 0;int right array.length - 1;while (left < right) {while (left < right &&…

IDEA2023版本整合SpringBoot热部署

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

手撕算法-最小覆盖子串

描述 分析 滑动窗口。 参考力扣官方的题解思路 本问题要求我们返回字符串 s 中包含字符串 t 的全部字符的最小窗口。我们称包含 t 的全部字母的窗口为「可行」窗口。 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸…

javascript基础练习题之渔夫捕鱼

一、题目要求&#xff1a;根据用户输入的年、月、日判断是打鱼还是晒网。代码中使用了isLeapYear函数来判断输入的年份是否为闰年&#xff0c;getDays函数来计算输入日期是一年中的第几天&#xff0c;然后根据计算结果来确定是打鱼还是晒网。最后代码通过弹窗提示用户是打鱼还是…

吴渔夫:AI技术引领游戏产业革命,小团队有大作为

AI技术的突飞猛进&#xff0c;游戏产业正在经历一场前所未有的变革。中国网游先锋&#xff0c;火石控股创始人吴渔夫&#xff0c;近日在接受第一财经日报的采访&#xff0c;对AI在游戏制作中的应用和未来趋势有着深刻的见解。 吴渔夫指出&#xff0c;AI技术的引入极大地降低了游…

游戏推广的新篇章:Xinstall助力实现全渠道效果统计与提升

随着游戏市场的日益繁荣&#xff0c;游戏推广已成为各大游戏公司争夺市场份额的关键环节。然而&#xff0c;面对众多推广渠道和复杂的用户行为&#xff0c;如何精准地评估推广效果、优化投放策略&#xff0c;成为了游戏推广人员亟待解决的问题。此时&#xff0c;Xinstall作为一…

绿岛机械加入2024第13届生物发酵展

参展企业介绍 南京绿岛机械设备有限公司是一家专注于碟式分离机领域的生产服务型企业。公司以多年从事离心分离设备的设计和制造经验为基础&#xff0c;通过产品改良和技术革新&#xff0c;从根本上解决了传统碟式分离设备的固有技术缺陷&#xff0c;增强了控制系统的安全性和…

2024第六届环境科学与可再生能源国际会议能源 (ESRE 2024) 即将召开!

2024第六届环境科学与可再生能源国际会议 能源 &#xff08;ESRE 2024&#xff09; 即将举行 2024 年 6 月 28 日至 30 日在德国法兰克福举行。ESRE 2024 年 旨在为研究人员、从业人员和专业人士提供一个论坛 从工业界、学术界和政府到研究和 发展&#xff0c;环境科学领域的专…

【C++初阶】之类和对象(中)

【C初阶】之类和对象&#xff08;中&#xff09; ✍ 类的六个默认成员函数✍ 构造函数&#x1f3c4; 为什么需要构造函数&#x1f3c4; 默认构造函数&#x1f3c4; 为什么编译器能自动调用默认构造函数&#x1f3c4; 自己写的构造函数&#x1f3c4; 构造函数的特性 ✍ 拷贝构造…

在Windows系统上安装多个 Nodejs

前言 在Windows系统安装Nodejs 在Windows系统上安装多个 Nodejs v14.16.1安装位置 D:\sde\nodejs\node-v14.16.1-win-x64 v16.20.2安装位置 D:\sde\nodejs\node-v16.20.2-win-x64 v18.20.0安装位置 D:\sde\nodejs\node-v18.20.0-win-x64 v20.12.0安装位置 D:\sde\nod…

Java毕业设计-基于springboot开发的游戏分享网站平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台登录2.1管理员功能模块2.2用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的…

ChatGLM2本地部署方法

chatglm2部署在本地时&#xff0c;需要从huggingface上下载模型的权重文件&#xff08;需要科学上网&#xff09;。下载后权重文件会自动保存在本地用户的文件夹上。但这样不利于分享&#xff0c;下面介绍如何将chatglm2模型打包部署。 一、克隆chatglm2部署 这个项目是chatgl…

“李子园”上榜中国民营企业社会责任优秀案例

日前&#xff0c;由浙江省工商联、浙江工商大学主办&#xff0c;杭州市工商联协办的2024浙江民营企业社会责任暨浙商ESG研讨会在杭州召开&#xff0c;探索民营企业履行社会责任的方法路径和趋势。会上公布了2023年中国民营企业社会责任优秀案例&#xff08;浙江入选企业&#x…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

【Linux】对进程地址空间的理解

一、关于进程地址空间的简单理解 进程地址空间其实是分了很多个区域的&#xff0c;区域划分的本质就是区域内的各个地址都是可以使用的。如同下面这个图所示&#xff1a; 无论是环境变量的地址还是环境变量表的地址&#xff0c;所存放的地址都在栈的上部。这里的已初始化数据和…

浅谈性能测试

本文主要针对WEB系统的性能测试。不涉及具体的执行操作&#xff0c;只是本人对性能测试的一点理解和认识。 性能测试的目的&#xff0c;简单说其实就是为了获取待测系统的响应时间、吞吐量、稳定性、容量等信息。而发现一些具体的性能相关的缺陷&#xff08;如内存溢出、并发处…

centos7系统下nginx1.24.0升级

如果没有这些目录&#xff0c;请先创建: mkdir /data/software mkdir /data/program提前下载所需的软件&#xff1a; cd /data/software wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz安装nginx cd /data/soft…

微信小程序开发之常用组件解释

1 基础内容组件 1.1text组件 text的功能主要是用于内联文本&#xff0c;与网页中的span有点类似。 主要属性有 例子&#xff1a;页面上添加一个可以选中的文本 在wxml文件中添加&#xff1a; <view> <text user-select>17544456565</text> </view>…

洗地机哪个好?专业对比,帮你选出比较适合的洗地机

随着科技的不断发展&#xff0c;洗地机已经成为了现代生活中不可或缺的清洁工具。然而&#xff0c;市面上涌现出各种各样的洗地机品牌&#xff0c;品质良莠不齐。因此&#xff0c;选择一个可靠的品牌至关重要&#xff0c;以确保产品质量和使用效果。为了帮助大家更好地选择&…