为什么LinkedHashSet将boolean accessOrder设置为false

时间:2017-12-07 14:11:14

标签: java collections linkedhashset

在Java中,LinkedHashSet是使用支持HashSet创建的,使用以下LinkedHashMap构造函数创建LinkedHashMap

map = new LinkedHashMap<>(initialCapacity, loadFactor);

现在在LinkedHashMap中,上面的构造函数依次调用

 public LinkedHashMap(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor);
    accessOrder = false;
}

那么有没有办法将accessOrder设置为true的LinkedHashSet? 这可以帮助使用LinkedHashSet创建LRU缓存实现。

2 个答案:

答案 0 :(得分:3)

LinkedHashSet不支持访问顺序,因为您没有访问LinkedHashSet的元素。

您可以向LinkedHashSet添加元素,然后按插入顺序迭代它们。

当您检查元素是否是LinkedHashSet的成员时,您无法访问它。您通过boolean contains(Object o)检查会员资格,并为支持地图调用map.containsKey(o)。但是,containsKey()不会影响Map的访问顺序。

另一方面,get(Object key)的{​​{1}}方法会影响访问顺序,但LinkedHashMap永远不会使用它。

答案 1 :(得分:1)

从源代码中可以看出,LinkedHashSet由LinkedHashMap支持,accessOrder设置为false。

此外,LinkedHashSet没有公共构造函数可以将访问顺序从插入顺序更改为访问顺序。

你可以尝试这个(只是一个例子):

LinkedHashSet<E> set = (LinkedHashSet<E>) Collections.newSetFromMap(new LinkedHashMap<>(16, 0.75f, true));