1、哈希表(hash)
哈希表也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,可以实现快速查询、插入、删除。
数组类型的数据结构在插入和删除时时间复杂度高,链表类型的数据结构在查询时时间复杂度高;而哈希表结合了数组和链表的优势。
在jdk8中,Java中经典的HashMap,以数组+链表+红黑树构成。
哈希函数在哈希表中起着关键作用,能够任意长度的输入转为定长的输出(哈希值)。通过哈希函数,能够快速的对数据元素进行定位。
哈希值并不是具有唯一性,在某些情况下Hash值会冲突,HashMap在Hash冲突时,会将元素在数组的位置上添加为链表元素结点,当链表长度大于8时,链表会转换为红黑树。
2、队列(queue)
类比水管,两端放开,一端入水,一端出水。
队列是一种特殊的线性表,他只允许表的前端进行删除操作,而在表的后端进行插入操作。
3、树(tree)
树是一种非线性结构,由n(n>0)个有限节点组成有层次关系的集合
二叉树:每个节点最多含有2个子树
完全二叉树:
只允许最后一层有空缺且空缺在右边,即叶子节点只能在层次最大两层出现
对于一个任意节点,如果其右子树的深度为j,其左子树的深度为j或j+1。即度为1的点只能有0个或1个
满二叉树:除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。
平衡二叉树:也称AVL树,当且仅当任何节点的两颗子树的高度差不大于1的二叉树。Java中HashMap的红黑树就是平衡二叉树。
4、堆
堆可以被看成一个树的数组对象,具有如下特点:
堆是一棵完全二叉树
最大堆/大根堆:某个节点的值不大于父节点的值
最小堆/小根堆:某个节点的值不小于父节点的值
5、栈(stock)
栈可以比水桶,只有一端能够进出,遵循先进后出的原则。
栈先进的元素进入栈底,读元素的时候从栈顶取出元素。
6、数组(Array)
数组是一种线性表的数据结构,连续的空间存储相同类型的数据。
优点:查询速度快
缺点:数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢。
7、链表(LinkedList)
链表是一种线性表的链式存储方式,链表的内存是不可连续的,前一个元素存储的下一个地址中存储的不一定是下一个元素。链表通过一个指向下一个元素地址的引用将链表中的元素串起来。
单向链表:单项链表是最简单的链表形式,我们将链表中最基本的数据称为节点(node),每一节点包括数据块和下一节点的指针。
双向链表:故名思议,双向链表就是有两个方向的链表,同单向链表不同,双向链表中每一个节点不仅存储下一节点的指针,而且存储指向前一个节点的指针。通过这种方式,能够通过在O(1)的时间内通过目的节点直接找到前驱节点,但是同时会增大指针的存储空间。
循环链表:循环链表是另一种形式的链式存储结构。他的特点是表中最后一个节点的指针域指向头结点,整个链表形成一个环。
单循环链表:在单向链表中,把终端结点的指针域改为头结点或开始结点即可。
多重链的循环链表: 将表中结点链在多个循环上。