我正在阅读日志文件但并非所有线路都希望立即处理。我在等待处理时使用队列/缓冲区存储行。
定期扫描此队列以查找特定行 - 当找到它们时,它们将从队列中删除(它们可以位于队列中的任何位置)。如果没有找到特定的行,则会逐行从队列的开头取出行进行处理。
因此,队列需要以下内容:
我最初编写代码的时候我没有Java或API的经验,只是使用了ArrayList,因为我知道它可以工作(不一定是因为它是最好的选择)。
随着越来越多的日志需要处理,其性能现在变得越来越差 - 那么,您建议在这种情况下使用哪种集合?总是有写我自己的可能性。
由于
答案 0 :(得分:6)
LinkedHashSet可能会引起您的兴趣。它实际上是一个HashSet,但它也维护一个LinkedList以允许可预测的迭代顺序 - 因此也可以用作FIFO队列,它具有很好的附加好处,即它不能包含重复的条目。
因为它也是一个HashSet,如果它们可以匹配equals()
答案 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等。