Java基础知识9

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。如果更新了键所对应的值,则返回原先的值。

各类Map比较

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值