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