MST

星途 面试题库

面试题:Java中LinkedHashSet在缓存场景应用时如何保证元素顺序

在缓存场景中使用Java的LinkedHashSet,它是通过什么机制来保证元素插入顺序或访问顺序的?请简要描述其原理及相关方法。
35.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 保证顺序的机制
    • 插入顺序LinkedHashSet继承自HashSet,并维护了一个双向链表来记录元素的插入顺序。每当有新元素插入时,会将其添加到链表尾部。
    • 访问顺序:如果构造LinkedHashSet时使用new LinkedHashSet(int initialCapacity, float loadFactor, boolean accessOrder)构造函数,并将accessOrder设为true,则会按照访问顺序维护链表。当元素被访问(如通过get方法访问,如果是在Map的场景下,这里LinkedHashSet类似Map的键集合,可类比理解),会将该元素移到链表尾部。
  2. 原理
    • LinkedHashSet内部使用LinkedHashMap来存储元素。LinkedHashMap继承自HashMap,在HashMap的基础上增加了双向链表的结构。HashMap本身是基于哈希表存储元素,而双向链表用于维护顺序。
    • 双向链表的节点类Entry继承自HashMap.Node,除了包含HashMap.Nodekeyvaluehashnext字段外,还增加了beforeafter字段来维护双向链表关系。
  3. 相关方法
    • 添加元素add(E e)方法用于向LinkedHashSet中添加元素。该方法实际调用的是内部LinkedHashMapput方法,将元素添加到哈希表的同时,会将其添加到双向链表尾部。
    • 访问元素:虽然LinkedHashSet本身没有直接的get方法来获取元素(因为它实现的是Set接口),但如果将其类比为Map的键集合,在LinkedHashMap中有get(Object key)方法,当accessOrdertrue时,访问元素后会调用afterNodeAccess方法将该元素移到链表尾部。afterNodeAccess方法会调整双向链表中节点的位置,将被访问的节点移到链表尾部。
    • 删除元素remove(Object o)方法用于删除元素。该方法会先从哈希表中删除对应的节点,然后从双向链表中删除该节点,通过调整双向链表节点的beforeafter指针来完成删除操作。