1、 数组(Arrary)
数组是一种线性结构的数据,连续的存储空间和相同的类型数据。查询速度快,但是数组的容量固定,无法扩容,只能存储同类型的数据,对于添加和删除元素比较慢
2、栈(Stark)
栈是一种先进后出的一种结构,好比水桶。例如虚拟机栈,方法栈等
3、链表(Linked List)
链表是一种线性的链式结构,链表的内存不是连续的,前一个节点存储的地址不一定就是一个元素,可能是一个引用,通过这个引用可以拿到对应的对象。链表是通过一个节点指向另一个节点的地址将元素串起来。
单向链表:最简单的链表格式。链表的最小单元为节点,每一个节点包含了数据和指向下一个节点的指针。
双向链表:两个方向的链表。链表的每个节点包含了数据以及前一个节点地址的指针和后一个节点的地址指针。这种数据结构的好处是通过当前节点可以通过时间复杂度o(1)很快定位到前置节点和后置节点,但是通过前置指针和后置指针的配置增加了内存的消耗。
循环链表:跟双向列表差不多,但是唯一的区别就是尾节点的后置指针指向头节点,头节点也有指针指向了尾节点。
3、哈希(Hash)
哈希也叫做散列。通过key-vlue的方式存储,在很大程度上提高了数据的查询,增加和删除。hash结合数组和链表的特性(数组查询快,链表增删快)。
Java最经典的HashMap的底层实现是数组+链表+红黑树
hash函数在hash表中起到至关重要作用,数据通过hash函数生成一个固定的hash值,通过hash值可以很快的定位到元素。但是hash值不是唯一的,就将hash值相同的放入链表中,如果链表的长度超过8,或者大小超过64,就将链表转化为红黑树。
4、队列(Queue)
队列是特殊的线性结构,一种先进先出的数据存储结构,数据的删除操作只能在头部操作,插入在尾部操作。
5、树(Tree)
树是一种线性结构,有节点组成的集合。
二叉树:每一个节点最多有两个子树
完全二叉树:除了最外层节点,其他的节点都达到最大的层数
满二叉树:一个树的节点要么是叶子节点,要么就是有两个节点
平衡二叉树:任何节点的子树高度差不超过1;
二叉查找树:任意节点的左子树都不能为空,并且左子树所有节点的值都小于根节点;任意节点的右子树不能为空,并且右子树所有节点的值都大于根节点;任意节点的左右子树都是一个二叉查找树。
B树:一种堆读写优化的自平衡二叉树,在数据库索引的常用索引数据的结构。
B+树:所有非叶子节点都是索引部分,节点中仅包含根节点的最大或者最小的关键字;所有叶子节点包含了所有关键字的信息以及含有这些关键字记录的指针,而且叶子节点数据根据关键节点的大小从小到大排列;m个子树的中间节点包含有m个元素,每个元素不包含数据,只包含索引。
红黑树
红黑树是一种平衡二叉树,通过颜色约束树的平衡。每一个元素要么红色,要么黑色;根节点一定是黑色;每个叶子节点都是黑色的;如果一个节点为红色,那么他的所有子节点都是黑色,因为每一条路径上都不能出现相邻两个节点是同一颜色;每一个叶子节点的所有路径存在的黑色节点都相同。
6、堆(Heap)
堆是一种特殊的树形结构,父节点的值大于等于子节点的值或者小于子节点的值。对于max heap根节点是所有节点的最大值 或者min heap根节点值是所有节点最小的值。
7、图(Graph)
一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。