treeset 上的性能问题#add

performance issue on treeset#add

在我的应用程序中,我使用 TreeSet 作为有序队列。我分析了我的应用程序,我将 25% 的 cpu 时间花在向 TreeSet 添加元素上,但只花 2% 的时间弹出最后一个元素。有序队列有更好的集合吗?添加到 LinkedList 并在每次我需要使用队列时对其进行排序会更高效吗?

您应该使用 PriorityQueue 而不是 TreeSet,因为这是为队列设计的。

TreeSet 在将其用作队列时存在性能问题,因为其内部树结构不适合用作队列。这是因为它的内部结构是基于一个TreeMap,withs使用了一个red black tree,并且这棵树需要移动很多元素来容纳替换顶部元素的插入。在某些情况下,这需要完全重建树。

使用 PriorityQueue 很简单:

PriorityQueue<YourObject> queue = new PriorityQueue<>();

TreeSet 不同,PriorityQueue 允许重复元素,并以 FIFO 顺序返回。

如果您需要防踩踏解决方案,您应该使用 PriorityBlockingQueue