1、栈结构
先进后出、无论出栈还是入栈都是在栈顶
2、队列
简称队,先进先出
3、数组
查询快、增删慢 ; 有索引
查询快:数组在内存中存储地址是连续的,每个元素所占大小是固定的,可以通过首地址+便宜 快速定位到制定元素
增删慢: 增删操作需要移动大量的元素
4、链表
查询慢、增删快;分单链表和双链表(LinkedList底层双链表)
查询慢:存储地址不连续,所以不能根据计算地址来获取元素
增删快:无需移动元素、只是修改指针域的数据
5、树
名词 | 含义 |
---|---|
节点 | 树中的一个元素 |
节点的度 | 节点用友子树的个数 |
叶子节点 | 度为0的节点,也称为终端节点 |
高度 | 叶子节点高度为1,叶子节点的父节点为2,根节点最高 |
层 | 根节点在第一层,以此类推 |
父节点 | |
子节点 | |
兄弟节点 | 拥有共同父节点 |
二叉树(树的一种)
树中的每个节点的子节点不超过2
二叉查找树(二叉树的一种)
1、左子树上所有节点的值均小于根节点的值 |
---|
2、右子树上所有节点的值均大于根节点的值 |
3、每一个子节点最多有2个子树(二叉树特点) |
遍历元素可以按照“左中右”的顺序遍历,查找时可能会出现“瘸子”现象(只有左树没有右树,层树太多;层数越多,查询越慢)
平衡二叉树(二叉树的一种)
左右两个子树高度差绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
旋转
左旋:将节点的右支往左拉,右子节点变成父节点,并把晋升后多余的左子节点让出给降级节点的右子节点
右旋:将节点的左支往右拉,左子节点变成父节点,并把晋升后多余的右子节点让出给降级节点的左子节点
由于在构建平衡二叉树的时候,当有新节点插入时,都会判断插入后时候平衡,这说明了插入新节点前,都是平衡的,也即高度差绝对值不会超过1。当新节点插入后,有可能会有导致树不平衡,这时候就需要进行调整,而可能出现的情况就有4种,分别称作左左,左右,右左,右右
左左:根的左节点的左节点下增加节点,方法:根节点右旋
左右:根的左节点左旋,变成左左,再根节点右旋
右左:根的右节点右旋,变成右右,再根节点左旋
红黑树
一种自平衡的二叉查找树,太难
并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
6、Set
特点:无序、值不重复、没有索引
HashSet
Set底层结构:哈希表,由数组+链表+红黑树组成
存数据:先通过hashCode()计算哈希值决定放在数组的哪个位置,如果此哈希值位置有值了,通过equals()比较两个值是否相同,如果相同则不让添加,如果不同则往下加入链表,链表长度超过8则该链表转变成红黑树(从1.8开始),提高查询效率
LinkedHashSet
链表和哈希表组合的一个数据存储结构,让数据有序
TreeSet
底层依赖于TreeMap,是一种基于红黑树的实现,其特点为:
- 元素唯一
- 元素没有索引
- 使用元素的自然顺序对元素进行排序,或者根据创建 TreeSet 时提供的 Comparator 比较器进行排序