• TreeMap和LinkedHashMap


    TreeMap

    总体特点:(主要是跟linkedHashMap比较)

    1. 底层是基于红黑树实现,是个有序集合,按照key的compareTo方法或在构造时传入的Comparator比较器进行排序。这里需要注意如果在构造 时没有传入Comparator,那么key必须实现Comparable接口,不然会报错

    2. TreeMap是通过Comparator比较器来构建红黑树从而保证key的有序性,而LinkedHashMap是通过双向链表来保证元素插入的有序性,两者有序性的含义不是一样的

    3. TreeMap继承于AbstractMap,linkedHashMap继承于HashMap.TreeMap里面只维护红黑树这个数据结构,而LinkedHashMap是数组+单向链表+双向链表结构。TreeMap的所有增删改查的操作都是对红黑树的操作,而LinkedHashMap的增删改查操作是先对数组的操作,再对双向链表的操作,遍历的时候是遍历的双向链表

    4. TreeMap主要用在需要排序的场景(还可以实现一致性hash算法),LinkedHashMap主要用在需要加密、签名、jvm缓存场景

      LinkedHashMap

    总体特点:

    1. 继承于HashMap,主要一些集合操作方法使用的都是父类HashMap中的方法,然后在创建节点时覆盖了newNode(int hash, K key, V value, Node e)方法,在此方法进行维护双向链表。他的数据结构类似于下面这样

    1. linkedHashMap内部是一个双向链表,是一个有序集合,他的有序主要是维护元素的插入顺序。主要实现了HashMap中的afterNodeAccess、afterNodeInsertion、afterNodeRemoval方法,afterNodeAccess在集合元素被访问(如put,get时)做一些操作,afterNodeInsertion在新元素插入时做一些操作,afterNodeRemoval在元素被删除时做一些操作,这些方法在LinkedHashMap都会对其维护的链表做相应的处理

    2. LinkedHashMap中有一个很重要的变量是accessOrder,默认是false,意思是当LinkedHashMap元素被访问时需不需要调整元素的顺序,默认是不需要调整,如果是true则是需要调整,然后会把每次访问的元素调整到链表的尾部

    实战经验及使用场景:

    1. LinkedHashMap很适合是使用在需要签名或加密的场景,因为他能保证插入元素的顺序性

    2. LinkedHashMap也很适合做jvm本地缓存,本地缓存需要考虑是线程安全性和防止内存泄漏。而LinkedHashMap可以完美的实现类似于LRU缓存算法,至于LRU算法是个什么算法这里不详细说了,最经典的就是dubbo中的工具类:org.apache.dubbo.common.utils.LRUCache。LinkedHashMap的链表中越接近head部分是最老最不常用的数据,越接近tail部分是最新最常用的数据,所以在元素需要淘汰时从head开始淘汰.在实现过程中主要通过accessOrder变量和removeEldestEntry(Map.Entry eldest)方法来实现,默认都是false。需要实现LRU算法时都需要设置成true

    公众号同名,欢迎关注 

  • 相关阅读:
    jQuery设置获取样式css()
    SC-RoadDeepNet学习笔记(持续更新)
    [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
    (数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述
    ElasticSearch - 初步检索
    [R] ggplot2 - exercise (“fill =“)
    “免费项目管理软件”20款大盘点!你认识哪几款?
    Linux下备份文件到其他服务器
    R语言使用lm函数构建带交互项的多元回归模型、使用step函数构建逐步回归模型筛选预测变量的最佳子集(step regression)
    【微服务】spring 控制bean加载顺序使用详解
  • 原文地址:https://blog.csdn.net/shidebin/article/details/126814905