Java中使用HashMap的场景,如何保证读取出来key的顺序和插入时一致

HashMap 底层的数据结构主要是:数组 + 链表 + 红黑树,是基于哈希表的实现,主要是为了解决键值(key-value)对应关联的,可以很快的根据键(key)找到该键对应的值(value)。实现思路是:假定元素是放在一个圆形的环上,每次put进来的元素根据其key的hashCode计算该元素在圆环上索引,把该元素放到合适的位置,所以HashMap是一种无序的存储结构,与元素放入的先后顺序无关。所以在使用HashMap的场景,如何保证读取出来key的顺序和插入时一致?

全部回答 · 1

  • 最新
  • 最热
  • 用户头像
    发出毛毛毛的声音2021.08.25 02:36

    在特定场景,我们期望得到一个有序的Map,这种情况下可以使用LinkedHashMap。 LinkedHashMap 给每个节点增加 before、after 属性,每次新增时都把新节点追加到尾节点,虽然增加了时间和空间上的开销,但在新增时,就已经维护了按照插入顺序的链表结构,可以认为是HashMap+LinkedList的实现,既使用HashMap操作数据结构,继承了HashMap中所有非private的方法,又使用LinkedList维护插入元素的先后顺序。 补充: LinkedHashMap提供了一个boolean值accessOrder,可以让用户指定是否实现LRU(Least Recently Used最近最少使用),经常访问的元素会被追加到队尾,不经常访问的数据自然就靠近队头,然后我们可以通过设置删除策略,比如当 Map 元素个数大于多少时,把头节点删除,实现淘汰最近最不常访问的数据。注意:accessOrder=false,所有的Entry按照插入的顺序排列,accessOrder=true,所有的Entry按照访问的顺序排列;get、put等方法的使用都算“访问”。

    • 踩
    • 收藏收藏
    • 评论评论5