最佳收藏品?

时间:2008-11-13 09:28:54

标签: java performance collections queue buffer

我正在阅读日志文件但并非所有线路都希望立即处理。我在等待处理时使用队列/缓冲区存储行。

定期扫描此队列以查找特定行 - 当找到它们时,它们将从队列中删除(它们可以位于队列中的任何位置)。如果没有找到特定的行,则会逐行从队列的开头取出行进行处理。

因此,队列需要以下内容:

  • 能够调整大小(或给人留下印象)
  • 从任何地方删除元素
  • 添加了元素(将始终位于队列末尾)
  • 快速扫描
  • 根据性能,指定上次扫描时的位置。

我最初编写代码的时候我没有Java或API的经验,只是使用了ArrayList,因为我知道它可以工作(不一定是因为它是最好的选择)。

随着越来越多的日志需要处理,其性能现在变得越来越差 - 那么,您建议在这种情况下使用哪种集合?总是有写我自己的可能性。

由于

8 个答案:

答案 0 :(得分:6)

LinkedHashSet可能会引起您的兴趣。它实际上是一个HashSet,但它也维护一个LinkedList以允许可预测的迭代顺序 - 因此也可以用作FIFO队列,它具有很好的附加好处,即它不能包含重复的条目。

因为它也是一个HashSet,如果它们可以匹配equals()

,搜索(而不是扫描)可以是O(1)

答案 1 :(得分:4)

LinkedList可能是最合适的。它具有所有请求的属性,并允许在固定时间内从中间删除链接,而不是ArrayList所需的线性时间。

如果您有一些特定的策略来查找要删除的下一个元素,则PriorityQueue甚至是有序集可能更合适。

答案 2 :(得分:2)

快速扫描通常意味着某种基于散列的实现,ConcurrentSkipListMap可能是一个很好的实现。在包含键,删除和获取方法上记录(n),并对其进行排序,以便您可以获得与之相关的某种优先级。

答案 3 :(得分:1)

我不想对正在读取的行进行排序(它们需要按原始顺序保存)。但是,我可能会根据每条记录行所拥有的会话ID来阻止这些行(每个会话记录几行)。

考虑一下,我可能有一个:

HashMap<String,LinkedList<String>>

并提供会话ID作为键,并使用属于会话的行填充LinkedList。

Map将提供一种快速搜索与会话X相关的行的方法,然后链表将提供添加/删除行的最佳性能(搜索性能是查找与会话x相关的行,因此可以从头到尾读取和删除与会话x相关的实际行 - 推送/弹出)。

是否有比链接列表更好的集合,它会调整大小,最后添加行并始终从头开始?我相信Queue集合还是扩展了链表吗?

答案 4 :(得分:0)

因为您需要从集合中删除和添加元素,并搜索特定值,所以更好的结构可能是实现SortedSet的东西,例如TreeSet。此类保证了添加,删除和包含的log(n)性能。

答案 5 :(得分:0)

我猜有些线程会写入队列而另一个线程将从中读取。

在这种情况下,您应该查看java.lang.concurrent包中的队列。

您可以使用PriorityBlockingQueue让它为您排序元素,如果您想迭代它并选择自己要删除的元素,可以使用LinkedBlockingQueue。

答案 6 :(得分:0)

我同意AVI并且链接列表将是您的最佳选择。您可以轻松调整大小,快速添加到列表的末尾,快速从任何地方删除。搜索速度不会很快,但不会比其他任何未排序的列表更糟糕。

答案 7 :(得分:0)

Guava可能会有所帮助。

  

Guava项目包含我们在基于Java的项目中依赖的几个Google核心库:集合,缓存,基元支持,并发库,通用注释,字符串处理,I / O等。