Java中有8种常见数据结构
哈希表也叫散列表,是一种可以通过关键码值(Key-Value)直接访问的数据结构,可以实现快速查询、插入、删除。
数组类型的数据结构在 插入和删除 时时间复杂度高;链表类型的数据结构在 查询 时时间复杂度高;而哈希表结合了数组与链表的优势。
在jdk8中,Java中经典的HashMap,以 数组+链表+红黑树 构成。
哈希函数在哈希表中起着关键作用,能够将任意长度的输入转为定长的输出(哈希值)。通过哈希函数,能够快速地对数据元素进行定位。
哈希值并不是具有唯一性,在某些情况下Hash值会冲突,HashMap在Hash冲突时,会将元素在数组的位置上添加为链表元素结点,当链表长度大于8时,链表会转换为 红黑树 。
类比水管,两端放开,一端入水,一端出水。
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
树是一种非线性结构,由n(n>0)个有限结点组成有层次关系的集合。
术语:
二叉树:每个结点最多含有2个子树。
完全二叉树:除了最外层的结点,其他各层结点都达到最大数。
满二叉树:
二叉查找树:
平衡二叉树:也称AVL树,当且仅当任何结点的两棵子树的高度差不大于1的二叉树。Java中HashMap的红黑树就是平衡二叉树!!!
B树:一种对读写优化的自平衡二叉树,在数据库的索引中常见的BTREE就是自平衡二叉树。
B+树:B+树是应文件系统所需而产生的B树的变形树。
实质上就是 平衡二叉树 ,通过颜色约束二叉树的平衡:
1)每个节点都只能是红色或者黑色
2)根节点是黑色
3)每个叶节点(NIL 节点,空节点)是黑色的。
4)如果一个节点是红色的,则它两个子节点都是黑色的。也就是说在一条路径上不能出现相邻的两个红色节点。
5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
堆可以被看成一个树的数组对象,具有如下特点:
数组是一种 线性表 的数据结构, 连续的空间 存储 相同类型 的数据。
优点:查询速度快。
缺点:数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢。
栈可以类比为水桶,只有一端能够进出,遵循的先进后出的规则。
栈先进的元素进入栈底,读元素的时候从栈顶取元素。
链表是一种线性表的链式存储方式,链表的内存是不连续的,前一个元素存储地址的下一个地址中存储的不一定是下一个元素。链表通过一个指向下一个元素地址的引用将链表中的元素串起来。
一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。