LinkedHashMap
HashMap插入元素时,通过i = (n - 1) & hash计算键位在数组中的位置,且具有一定的随机性,这导致遍历时的顺序与插入时的顺序不一样。
而LinkedHashMap则可以保证遍历顺序与插入时一致,其集成了HashMap,并实现了Map接口,同时其内部追加了双向链表,来维护元素的插入顺序,通过before和after,分别来维护当前元素的前一个元素和后一个元素的顺序的。
LinkedHashMap也可维护访问顺序,在初始化LinkedHashMap时,可传入初始容量、负载因子、访问参数,若访问参数为true,则要维护访问顺序,在这种情况下,当使用get获取某个元素时,该元素到达尾部,其通过afterNodeAccess()在调用get方法时实现,将对应节点放到双链表的尾部。
使用场景:可使用LinkedHashMap来实现 LRU 缓存,LRU是最近最少使用算法,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。
查找操作只需在哈希表中进行,时间复杂度为O(1)。
TreeMap
TreeMap是由红黑树实现的,其可自定义排序方式,其中可通过Comparator.reverseOrder()反转顺序。
TreeMap提供了lastKey()、firstKey(),可获取最后一个key和第一个 key 的方法。
headMap获取的是到指定key之前的 key,tailMap获取的是指定key之后的key(包含key),subMap获取指定区间的key。
红黑树
红黑树是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持二叉树的平衡,它要求任意一条路径上的黑色节点数目相同,同时还需要满足一些其他特定的条件,如红色节点的父节点必须为黑色节点等,具体如下:
1、每个节点都只能是红色或者黑色
2、根节点是黑色
3、每个叶节点(NIL节点,空节点)是黑色的。
4、如果一个节点是红色的,则它两个子节点都是黑色的,即一条路径上不能出现相邻的两个红色节点。
5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
红黑树的平衡度比平衡二叉树较低,在插入、删除操作时需要进行旋转操作较少,但在查找时效率较高,因此适用于读写操作比较均衡的场景。
插入数据流程
1、首先定义一个Entry类型的变量t,用于表示当前的根节点;
2、如果t为null,说明TreeMap为空,直接创建一个新的节点作为根节点,并将size设置为1;
3、如果t不为null,说明需要在TreeMap中查找键所对应的节点。因为TreeMap中的元素是有序的,所以使用二分查找的方式来查找节点,当其小于所遍历到的节点时,则遍历左子树,当其大于所遍历到的节点时,则遍历右子树;
4、如果TreeMap中使用了Comparator来进行排序,则使用Comparator进行比较,否则使用Comparable进行比较。如果查找到了相同的键,则直接更新键所对应的值;
5、如果没有查找到相同的键,则创建一个新的节点,并将其插入到TreeMap中。然后使用fixAfterInsertion()方法来修正插入节点后的平衡状态;
6、最后将TreeMap的size加1,然后返回null。如果更新了键所对应的值,则返回原先的值。