java – 是否有任何数据结构保留迭代顺序并删除旧记录?

我有一个用例,我希望将条目填充到多个线程的数据结构中,因此它必须是线程安全的,并且在达到特定大小后开始丢弃旧记录.我还想以与Insertion相同的顺序迭代数据结构.

所以我决定在这里使用Guava Cache,但令我惊讶的是,Guava asMap()方法不会以任何特定的顺序返回元素.

private final Cache<Integer, Integer> cache =
      CacheBuilder.newBuilder().maximumSize(10)
          .removalListener(
              RemovalListeners.asynchronous(new CustomListener(), executorService)
          ).build();

cache.put(1, 1);
cache.put(2, 2);
cache.put(3, 3);
cache.put(4, 4);
cache.put(5, 5);
cache.put(6, 6);

for (Entry<Integer, Integer> entry : cache.asMap().entrySet()) {
  System.out.println(entry.getKey() + "=" + entry.getValue());
}

输出:

2=2
6=6
1=1
4=4
3=3
5=5

我可以在这里使用哪些其他有效的数据结构,它可以为我保留迭代顺序,并且一旦达到大小就可靠地丢弃旧记录,并为删除侦听器进行一些回调,在那里我可以找出哪些记录被丢弃?

任何例子都会有很大的帮助.我使用的是Java 7,但还无法切换到Java 8.

所以我应该能够在迭代时得到这样的东西,并且它应该自动删除旧记录:

1=1
2=2
3=3
4=4
5=5
6=6

最佳答案 对于Java 7,您可以使用
Caffeine的前身
ConcurrentLinkedHashMap

ConcurrentMap<Integer, Integer> cache =
        new ConcurrentLinkedHashMap.Builder<Integer, Integer>()
                .maximumWeightedCapacity(10)
                .build();

cache.put(1, 1);
cache.put(2, 2);
cache.put(3, 3);
cache.put(4, 4);
cache.put(5, 5);
cache.put(6, 6);

for (Entry<Integer, Integer> entry : cache.entrySet()) {
    System.out.println(entry.getKey() + "=" + entry.getValue());
}

产量

1=1
2=2
3=3
4=4
5=5
6=6

有关详细信息,请参见ExampleUsage · ben-manes/concurrentlinkedhashmap Wiki.

点赞