二叉树基础
二叉排序树BST:左子树 < 根节点 < 右子树
平衡二叉树AVL:在BST基础上有自己的插入fixup、删除fixup方法,左右子树严格平衡,高度差不超过1
红黑树:在BST基础上有自己的插入fixup、删除fixup方法,左右子树不严格平衡,根节点黑色,任意相邻结点不能是红色
B树:一个节点可以有多个关键字且可以有多个孩子的树。每一个元素在该树中只出现一次
B+树:在B树的基础上把叶子结点连起来,因此通过根指针和链表指针能够实现范围查询。叶结点包含了全部关键字,非叶结点中的关键字也会出现在叶结点中。
HashMap
HashMap采用
数组+链表/红黑树
(注: 红黑树能够保证平衡的二叉查找树)HashMap
和LinkedHashMap
是线程不安全的,ConcurrentHashMap
是线程安全的HashMap的key为对象时,必须重写对象的hashcode()和equals()方式,因为判断对象是否重复时,先判断hashcode()
默认的hashcode方法返回的是对象的内存地址经过哈希算法转换后的一个整数,两个不同的对象hashcode也可能相同
@EqualsAndHashCode(callSuper = false)
:默认只使用本类的非静态属性生成 equals/hashcode方法,callSuper = true,将使用父类中的属性和本类中的属性 生成equals/hashcode方法当HashMap中元素个数超过 数组大小*loadFactor 时就会扩容。默认数组大小Capacity为16,每次扩容就把数组大小扩大一倍;loadFactor为负载因子,默认为0.75,负载因子的大小决定了HashMap的数据密度
当HashMap中一个链的对象个数达到8个,并且数组容量capacity达到64,这个链表就会用红黑树表示,如果没有达到64就先扩容解决。如果树中结点个数低于6个,树就会转换为链表
LinkedHashMap
LinkedHashMap采用的是
数组+链表/红黑树+循环双向链表
,HahMap中的元素是无序的,LinkedHashMap的元素是有序的,默认最先插入的元素被添加到尾部,LinkedHashMap
和HashMap
都是线程不安全的LinkedHashMap有一个
accessOrder
属性,可以在new LinkedHashMap的时候传进去.accessOrder
默认为false,表示访问元素不会改变其在双向链表中的顺序;如果accessOrder
为true,则访问元素的时候 (即get一个元素的时候),会把该元素移动到双向链表的末尾,也就是说为true时,经常访问的元素会被放在链表尾部,不经常访问的元素放在头部当有新元素加入Map的时候会调用
removeEldestEntry
方法删除头部最老的元素,默认的情况下removeEldestEntry
方法只返回false表示永远不删除旧元素,这就是实现LRU元素过期机制的地方
ConcurrentHashMap
jdk1.8采用 Node数组+链表/红黑树
,和HashMap结构相同,synchronized 只锁定当前链表或红黑树的首节点,这样只要 hash 不冲突,就不会阻塞