Java 不确定要选择哪种类型的列表?

Java 不确定要选择哪种类型的列表?,java,data-structures,Java,Data Structures,我对Java(但正在学习)数据结构没有太多经验,也不确定要选择什么类型的列表。我的问题是,我正在创建一个套接字服务,该服务接收数据并对照列表进行检查,如果数据不存在,则将数据传递给要处理的对象,并将数据ID号添加到列表中,以便不再处理相同的数据(处理数据的服务不知道是否存在重复工作,因此这起到了过滤器的作用) 我读到arraylist速度很快,但我刚刚意识到它需要我知道列表的大小,我不知道,因为它一直在增长(它肯定会达到几十亿项)。我想我会使用老式的整数[],但我想问是否有更好的方法 与我的流程

我对Java(但正在学习)数据结构没有太多经验,也不确定要选择什么类型的列表。我的问题是,我正在创建一个套接字服务,该服务接收数据并对照列表进行检查,如果数据不存在,则将数据传递给要处理的对象,并将数据ID号添加到列表中,以便不再处理相同的数据(处理数据的服务不知道是否存在重复工作,因此这起到了过滤器的作用)

我读到arraylist速度很快,但我刚刚意识到它需要我知道列表的大小,我不知道,因为它一直在增长(它肯定会达到几十亿项)。我想我会使用老式的整数[],但我想问是否有更好的方法

与我的流程相关的细节很少,我的数据本身很复杂,但对于查找,我将数据转换为哈希代码并进行检查,因此我的所有数据都是整数(正/负)客户端请求的服务是通过runnable来完成的,所以如果我可以做些什么来提高数据的效率,我可以这样做(我在想,因为它的所有整数可能会每隔一段时间对其进行排序,以使循环更快?)。integer[]足够好吗,或者还有更好的吗

it will surely hit several billion items
我非常怀疑,那将是千兆字节的数据

如果你真的有几十亿个项目,我建议将它们保存在数据库而不是内存中。你当然可以在内存中缓存一个子集,以加快查询速度,但长期的解决方案是,即使服务器停机,数据库也会保留值

一个数据库查询来检查一个ID是否存在只需要几毫秒。我认为这是一个比将它们存储在内存中更好的长期解决方案

我非常怀疑,那将是千兆字节的数据

如果你真的有几十亿个项目,我建议将它们保存在数据库而不是内存中。你当然可以在内存中缓存一个子集,以加快查询速度,但长期的解决方案是,即使服务器停机,数据库也会保留值


数据库查询以检查是否存在ID只需几毫秒。我认为这是一个比将ID存储在内存中更好的长期解决方案。

如果ID是一个数字或字符串,您可以使用
哈希集,其中
IDType
是ID的类型(例如
int
)。这确保了最佳搜索时间,并且每个元素只存储一次


ArrayList也可以使用,但要在其中搜索,您必须遍历整个列表(可能是在最坏的情况下),比较每个元素。

如果ID是数字或字符串,您可以使用
哈希集,其中
IDType
是ID的类型(例如
int
)。这确保了最佳搜索时间,并且每个元素只存储一次


ArrayList也可以使用,但要在其中搜索,您必须遍历整个列表(可能是在最坏的情况下),比较每个元素。

好吧,如果你想检查贵重物品,那么无论哪种方式,你都必须存储所有物品。我建议使用
HaspMap
。此外,如果一个hashmap可能不够,你可以使用多个
hashmap

您可以通过执行以下操作轻松检查

if(map.containsKey(blah))
    //Do something
如果您认为可以根据某些内容区分项目,请使用多个
hashmap
。这可能会更快。
此外,由于项目如此之大,我建议使用
LinkedHashMap
HashMap
进行一些缓存。这将加快过程,因为
LinkedHashMap
将频繁出现的项目存储在其优先级Q中。

如果您试图检查珍贵的项目,那么无论哪种方式都可以s您必须存储所有项目。我建议使用
HaspMap
。此外,如果一个hashmap可能不够,您还可以使用多个
hashmap

您可以通过执行以下操作轻松检查

if(map.containsKey(blah))
    //Do something
如果您认为可以根据某些内容区分项目,请使用多个
hashmap
。这可能会更快。
此外,由于项目如此之大,我建议使用
LinkedHashMap
HashMap
进行一些缓存。这会加快过程,因为
LinkedHashMap
会将频繁出现的项目存储在其优先级Q中。

如果您已经对数据进行哈希处理,为什么不使用其中一个哈希值呢集合,例如HashSet或HashMap,而不是列表?

如果您已经在对数据进行哈希运算,为什么不使用其中一个哈希集合,例如HashSet或HashMap,而不是列表?

我希望它不会命中超过2147483647项。那么您将遇到比选择哪种类型的列表更大的问题。@Jeffrey我会祈祷好运的它没有:-)您可能应该使用集合而不是列表来避免重复。我希望它不会超过2147483647项。那么,您将面临比选择哪种类型的列表更大的问题。@Jeffrey我会祈祷它不会:-)您可能应该使用集合而不是列表来避免重复。