Java中常见的八种数据结构
Java中常见数据结构
一、 8种数据结构
Java中有8种常见数据结构
- 哈希表(Hash)
- 队列(Queue)
- 树(Tree)
- 堆(Heap)
- 数组(Array)
- 栈(Stock)
- 链表(Linked List)
- 图(Graph)
哈希表(Hash)
哈希表也叫散列表,是一种可以通过关键码值(Key-Value)直接访问的数据结构,可以实现快速查询、插入、删除。
数组类型的数据结构在插入和删除时时间复杂度高;链表类型的数据结构在查询时时间复杂度高;而哈希表结合了数组与链表的优势。
在jdk8中,Java中经典的HashMap,以数组+链表+红黑树构成。
哈希函数在哈希表中起着关键作用,能够将任意长度的输入转为定长的输出(哈希值)。通过哈希函数,能够快速地对数据元素进行定位。
哈希值并不是具有唯一性,在某些情况下Hash值会冲突,HashMap在Hash冲突时,会将元素在数组的位置上添加为链表元素结点,当链表长度大于8时,链表会转换为红黑树。
队列(Queue)
类比水管,两端放开,一端入水,一端出水。
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
树(Tree)
树是一种非线性结构,由n(n>0)个有限结点组成有层次关系的集合。
术语:
二叉树:每个结点最多含有2个子树。
完全二叉树:除了最外层的结点,其他各层结点都达到最大数。
满二叉树:
- 国内定义:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。
- 国外定义:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。
二叉查找树:
- 任意结点的左子树不为空,左子树所有结点的值均小于根结点的值。
- 任意结点的右子树不为空,右子树所有结点的值均大于根节点的值。
- 任意结点的左右子树也是一颗二叉查找树。
平衡二叉树:也称AVL树,当且仅当任何结点的两棵子树的高度差不大于1的二叉树。Java中HashMap的红黑树就是平衡二叉树!!!
B树:一种对读写优化的自平衡二叉树,在数据库的索引中常见的BTREE就是自平衡二叉树。
B+树:B+树是应文件系统所需而产生的B树的变形树。
- 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字
- 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。
- 有m个子树的中间节点包含有m个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引。
Java8中HashMap的红黑树
实质上就是平衡二叉树,通过颜色约束二叉树的平衡:
1)每个节点都只能是红色或者黑色
2)根节点是黑色
3)每个叶节点(NIL 节点,空节点)是黑色的。
4)如果一个节点是红色的,则它两个子节点都是黑色的。也就是说在一条路径上不能出现相邻的两个红色节点。
5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
堆(Heap)
堆可以被看成一个树的数组对象,具有如下特点:
- 堆是一颗完全二叉树。
- 最大堆/大根堆:某个结点的值不大于父结点的值。
- 最小堆/小根堆:某个结点的值不小于父结点的值。
数组(Array)
数组是一种线性表的数据结构,连续的空间存储相同类型的数据。
优点:查询速度快。
缺点:数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢。
栈(Stock)
栈可以类比为水桶,只有一端能够进出,遵循的先进后出的规则。
栈先进的元素进入栈底,读元素的时候从栈顶取元素。
链表(Linked List)
链表是一种线性表的链式存储方式,链表的内存是不连续的,前一个元素存储地址的下一个地址中存储的不一定是下一个元素。链表通过一个指向下一个元素地址的引用将链表中的元素串起来。
- 单向链表:单向链表是最简单的链表形式。我们将链表中最基本的数据称为节点(node),每一个节点包含了数据块和指向下一个节点的指针。
- 双向链表:顾名思义,双向链表就是有两个方向的链表。同单向链表不同,在双向链表中每一个节点不仅存储指向下一个节点的指针,而且存储指向前一个节点的指针。通过这种方式,能够通过在O(1)时间内通过目的节点直接找到前驱节点,但是同时会增加大量的指针存储空间。
- 循环链表:循环链表与双向链表相似,不同的地方在于:在链表的尾部增加一个指向头结点的指针,头结点也增加一个指向尾节点的指针,以及第一个节点指向头节点的指针,从而更方便索引链表元素。
图(Graph)
一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。
Java中常见的八种数据结构相关推荐
- 对Java中常见的四种I/O模型理解
对Java中常见的四种I/O模型理解 1.1 知识科普 1.1.1 同步阻塞I/O(Blocking I/O) 1.1.1.1 阻塞与非阻塞 1.1.1.2 同步与异步 1.1.1.3 同步阻塞I/O ...
- Java中常见的几种任务调度框架对比
Java 任务调度框架对比 一. 概述 二. 对比 三. 参考 一. 概述 本文准备Java中常见的几种任务调度框架进行对比,其中包括Quartz.Elastic Job以及xxl-job. 二. 对 ...
- java中常见的几种内部类,你会几个?(未完)
点击上方蓝色关注我们! 大家好,我是雄雄,今天给大家介绍的是java中的几种内部类. java中常见的几个内部类,你会几个?我会四个! 在看每个新知识点时,我们不禁有这样或者那样的疑问,比如它是什么? ...
- redis hash删除所有key_一文详解Redis面试中常见的5种数据结构及对应使用场景
欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...
- windows7没pdf打印机_公司中常见的八种打印机故障解决方法
前面我们学习了打印机共享的基础知识.怎么共享打印机,可是在使用过程中却发现经常会出现无法打印的情况,这是什么原因导致的了,来跟我一起了解下公司中八种常见的打印机无法打印的故障现像与处理方法吧,这是在公 ...
- Java中常见的5种WEB服务器介绍
Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.Java常用的Web服务器有哪些?本文将由小千给大家讲解. 开发Java We ...
- Java中常见的几种类型转换
1 public class ChangeClass 2 { 3 public static void main(String[] args){ 4 5 //Int型数字转换成字符串 6 int nu ...
- Java中常见的十八种异常!
作为一只敬业的程序员,就是不能接受我的编程出现bug!可见我们对bug是如此的深恶痛觉!它已成为我们职业生涯中的拦路虎,所以今天小千精心为大家总结一下Java中常见的几种异常,望大家多多注意. 1.j ...
- Java中非法参数的异常,java中常见的异常语句
Java中常见的8种异常语句 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组下 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
最新文章
- Pytorch Lightning 完全攻略!
- zookeeper都有哪些使用场景
- python基础知识资料-Python基础知识快速学习系列视频课程
- Ionic 标签中添加单击事件 、双击事件
- 运维如何逆袭?月薪30K的牛逼运维需要的知识,全在这里了
- vscode配置浏览器
- pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...
- 【To Read】LeetCode | Jump Game II(转载)
- Windows和Linux内存检测工具:Valgrind,Visual Leak Detector,CppCheck, Cpplint
- ngx_http_upstream_module模块学习笔记
- Ubuntu(小名乌班图)的安装顺便附带VMware的安装教程,以及VM的激活密钥
- od ida 栈溢出初体验
- 阿里巴巴技术大牛赏鉴
- 2022最新高级java面试题
- DSP2812入门2——结构资源性能
- KMP复习之poj 3461 Oulipo
- Grounded theory相关知识
- css:使用div绘制一条竖线
- Hystrix - 阻断器
- beyond compare