Java 最适合使用的收藏?

Java 最适合使用的收藏?,java,performance,collections,queue,buffer,Java,Performance,Collections,Queue,Buffer,我正在读取日志文件,但并非所有的行都希望立即处理。我使用队列/缓冲区来存储等待处理的行 定期扫描此队列中的特定行-当找到这些行时,会将它们从队列中删除(它们可以位于队列中的任何位置)。当找不到特定的行时,将从队列的开始处逐个取出行进行处理 因此,队列需要以下内容: 能够调整大小(或给人留下这样的印象) 从任何地方移除元素 添加元素(将始终位于队列末尾) 快速扫描 根据性能的不同,有一个指针,指示上次扫描时它到达的位置 我最初编写代码的时候对Java或API几乎没有经验,我只是使用ArrayL

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

定期扫描此队列中的特定行-当找到这些行时,会将它们从队列中删除(它们可以位于队列中的任何位置)。当找不到特定的行时,将从队列的开始处逐个取出行进行处理

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

  • 能够调整大小(或给人留下这样的印象)
  • 从任何地方移除元素
  • 添加元素(将始终位于队列末尾)
  • 快速扫描
  • 根据性能的不同,有一个指针,指示上次扫描时它到达的位置
我最初编写代码的时候对Java或API几乎没有经验,我只是使用ArrayList,因为我知道它可以工作(不一定是因为它是最好的选择)

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


谢谢

链接列表可能是最合适的。它具有所有请求的属性,并允许以恒定时间从中间移除链接,而不是ArrayList所需的线性时间


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

快速扫描通常意味着某种基于哈希的实现,ConcurrentSkipListMap可能是一个很好的实现。在ContainesKey、remove和get方法上记录(n),并对其进行排序,这样您就可以拥有与之相关联的某种优先级。

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

我猜一些线程将写入队列,另一个线程将从中读取

在本例中,您应该查看java.lang.concurrent包中的队列


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

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

考虑到这一点,我可能会:

HashMap<String,LinkedList<String>>
HashMap
并提供会话id作为密钥,并使用属于会话的行填充LinkedList

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


有没有比链表更好的集合?链表可以调整大小,在末尾添加行,并且总是从开头开始?我相信队列集合无论如何都会扩展链表?

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


因为它也是一个哈希集,所以如果搜索(与扫描相反)可以在
equals()上匹配,则搜索可以是O(1)

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

可能会有所帮助

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


链表搜索要删除的元素不是很慢吗?这可能是链表的缺点之一,潜在的搜索速度很慢在链表中搜索取决于搜索的类型。完成每件事都相当容易,而移除是微不足道的;是的,搜索会很慢(ish),但如果他在每次搜索中都可能删除多个项目,那么越便宜的删除就越值得慢搜索。另一方面,如果要删除的目标非常稀少,那么它可能不是最好的解决方案。这两个方面都是最好的。感谢您让我了解这个集合,否则我永远不会想到它:0)在将这个集合添加到SDK之前,我自己反复创建了这个集合,它非常有用(并且自己从哈希集和LinkedList中编写它只需要几行代码)。