0

我对 Java(但正在学习)数据结构没有那么丰富的经验,并且不确定要选择哪种类型的列表。我的问题是我正在创建一个套接字服务,它接受数据并根据列表检查它,如果它不存在,那么它将数据传递给要处理并将数据 ID 号添加到列表中,这样相同的数据就不会再次处理(处理数据的服务不知道是否存在重复工作,因此这充当过滤器)。

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

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

4

4 回答 4

2
it will surely hit several billion items

我对此表示高度怀疑。那将是千兆字节的数据。

如果您真的有数十亿个项目,我建议将它们保存在数据库而不是内存中。您当然可以在内存中缓存一个子集以使某些查询更快,但长期的解决方案是一个即使服务器出现故障也能保留值的数据库。

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

于 2012-04-16T01:35:36.813 回答
1

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

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

于 2012-04-16T01:35:41.640 回答
1

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

您可以通过以下方式轻松检查

if(map.containsKey(blah))
    //Do something

hashmap如果您认为可以根据某事区分项目,请使用多个。那可能会更快。另外,由于项目这么大,我建议使用 aLinkedHashMapHashMap来做一些缓存。这将加快进程,因为LinkedHashMap它将经常出现的项目存储在其优先级 Q 中。

于 2012-04-16T01:37:32.887 回答
1

如果您已经在对数据进行散列处理,为什么不使用散列集合之一,例如 HashSet 或 HashMap 而不是列表?

于 2012-04-16T01:37:43.107 回答