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

时间:2012-04-16 01:32:51

标签: java data-structures

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

我读到arraylist很快但我刚才意识到它需要我知道之前列表的大小,我不会随着它不断增长(它肯定会达到数十亿个项目)。我以为我会使用旧时尚整数[],但我想我会问是否有更好的方法。

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

4 个答案:

答案 0 :(得分:2)

it will surely hit several billion items

我非常怀疑。这将是千兆字节的数据。

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

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

答案 1 :(得分:1)

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

ArrayList也可以工作,但要搜索它,你将不得不遍历整个列表(可能在最坏的情况下),比较每个元素。

答案 2 :(得分:1)

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

您可以轻松查看

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

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

答案 3 :(得分:1)

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