数据结构

Hashmap

JDK 1.8中的 HashMap 有哪些优化
  • 扩容前长度为 16,用于计算 (n-1) & hash 的二进制 n-1 为 0000 1111,扩容为 32 后的二进制就高位多 了 1,为 0001 1111。
  • 采用数组+链表/红黑树的模型
  • 链表采用尾插法
JDK 1.8中的 ConcurrentHashMap 有哪些优化
  • 使用CAS+synchronized替换segemnt+ReentrantLock
  • 将bucket视为segement,锁的粒度为一个bucket
JDK 1.7 HashMap高并发死循环问题
  • 核心原因是头插法反转了链表
JDK1.8 ConcurrentHashMap的死循环bug
  • LinkedHashmap和LRU的实现原理
 

Skiplist

  • 跳表是一种能替代平衡树/红黑树的数据结构
  • 跳表实现简单, 锁粒度可以做到很细, 适用于内存但不适用磁盘(随机io次数比较多)
  • LSM-Tree中的MemTable使用跳表
Redis ZSET为什么用跳表而不用平衡树?
  • 范围查找更简单
  • 算法更容易实现
  • 插入和删除更简单
  • 多线程友好

Tree

MySQL索引为什么不用跳表,Redis为什么不用B+树
  • skiplist层级会更多,这在内存中不是问题但是面对磁盘就是问题
  • 非完全二叉树需先补齐成完全二叉树才能按数组存储
  • 二叉树中序排列会得到有序的序列
用数组表示二叉树
  • 前序的话数组第一个元素则为root
  • 后序的话数组最后一个元素则为root
前序和后序序列数组无法确定唯一的二叉树
  • 例如前序: [1, 2, 3]和后序:[3, 2, 1]可对应对称的两个二叉树
  • 二叉树的先序遍历(非递归版)
  • 二叉树的中序遍历(非递归版)
  • 二叉树的后序遍历(非递归版)
  • 从上往下打印二叉树
  • 二叉树的构建
  • 二叉树的镜像
  • 二叉树的子结构
  • 二叉搜索树的后序遍历序列
  • 重建二叉树

Linkedlist

  • 将搜索二叉树转换成双向链表
  • 删除单链表的第 K 个节点
  • 删除单链表的中间节点
  • 如何优雅着反转单链表
  • 环形单链表约瑟夫问题
  • 三种方法带你优雅判断回文链表
  • 将单向链表按某值划分成左边小,中间相等,右边大的形式
  • 复制含有随机指针节点的链表
  • 将单链表的每 K 个节点之间逆序

Graph

Array

无锁数据结构