Java基本数据结构(堆栈\队列\数组\链表\树)
Java中提供了很丰富的容器技术,这些容器技术在底层都是通过各种各样的数据结构来实现的。
下面列出了几个 常见的数据结构,简单的做一下了解
栈
- 栈:stack,又称为堆栈,它是运算受限的线性表,其限制是仅允许在栈的一端进行插入和删除操作,不允许在其它任何位置进行添加、查找、删除等
- 该结构的集合的特点:
- 先进后出(先存进去的元素,要在它后面的的元素都取出后才能取出,就像子弹夹)
- 压栈(push):存元素。
- 弹栈(pop):取元素。
队列
- 队列:queue,简称队,它和堆栈一样,也是一种运算受限的线性表,其限制是仅允许在队列的一端插入,在另一端删除
- 该结构的集合的特点:
- 先进先出(后存进去的元素,要在它前面的元素都取出后才能取出,就像火车过隧道)
- 队列的入口、出口各占一侧
- 队列还分为单项有序队列、双向队列阻塞队列
数组
- 数组:Array:是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素,每一个元素都有自己的编号,通过编号就能快速的操作元素
- 该结构的集合的特点:
- 查找元素快。通过索引可以快速访问指定位置上的元素
- 增删元素慢。当指定索引要添加元素时,需要创建一个新的数组,将指定的新元素存储在指定的位置,再把原数组中的元素根据索引复制到新数组的指定位置上
链表
- 链表:linked list。由一系列的节点node组成,节点可以在运行时动态生成,每个节点包括两个部分,一个存储数据的数据域,另一个是存储下一个节点地址的指针域。
- 该结构的集合的特点:
- 多个结点之间,通过地址进行连接。(多个人手拉手,每个人使用自己的右手拉住下个人的左手,以此类推,这样多个人就连在一起了)
- 查找元素慢,想查找某个元素,需要通过连接的结点,依次向后查找指定元素
- 增删元素快,只需要修改连接下个元素的地址即可
- 常说的链表接口有单项链表和双向链表,双向链表就是在单线链表的基础上,在开头位置,增加了一个存储上一个节点地址的指针域。
树
-
由n个节点组成的具有层次关系的集合(看起来像一个树,由一个根节点,向外开枝散叶)
-
二叉树:binary tree是每个结点不超过2的有序树
- (简单的理解,就是一种类似我们生活中的树结构,只不过每个结点上都最多只能有两个子节点)
- 二叉树是每个结点最多有两个子节点的树结构,顶上的叫根结点,两边的称作左子树和右子树
-
我们说的二叉树的一种比较有意思的叫做红黑树,红黑树本身就是二叉树,也意味着,存放的数据必须是可排序的
-
红黑树通过红黑标记和左右旋转规则来保证了二叉树平衡
-
红黑树的特点:
- 每个节点不是红就是黑,根节点是黑
- 一个红的节点,它的两个子节点一定是黑的