如何将Java ConcurrentNavigableMap与比较器而不是TreeMap一起使用?

时间:2011-10-25 14:45:18

标签: java sorting

我需要构建队列,它将始终按其键排序。 TreeMap接口非常适合它,就像在这个例子中一样: http://www.javaexamples4u.com/2009/03/treemap-comparator.html 但最大的问题是它不是线程安全的,然后我找到了ConcurrentNavigableMap
很好,但我如何使用比较与TreeMap相同的方式?我没有找到任何例子。

2 个答案:

答案 0 :(得分:1)

ConcurrentNavigableMap就是这个界面。您需要使用实现它的具体类,它在标准集合库中是 ConcurrentSkipListMap

您基本上应该能够使用ConcurrentSkipListMap作为TreeMap的替代品,包括使用比较器。操作通常具有类似的性能特征(O(log n)),但据我所知,ConcurrentSkipListMap的size()操作需要遍历跳过列表而不是简单地读取变量,所以如果你经常调用它,就要小心点一张大地图。

答案 1 :(得分:1)

听起来你实际上正在寻找PriorityQueue。如果您需要线程安全版本,可以使用PriorityBlockingQueue

优先级队列是一个队列,您可以在其中检索按“重要性”排序的项目。对于Java,您可以使用Comparator或项目的自然顺序(如果它们实现Comparable)。

如果您确实需要使用ConcurrentNavigableMap,则需要使用它的实现,例如ConcurrentSkipListMap。只需分配一个ConcurrentSkipListMap实例并将其传递给你想要使用的比较器。

new ConcurrentSkipListMap<MyKeyType, MyValueType>(new MyKeyComparator());