我不熟悉Java(但是学习)数据结构,并且不确定选择哪种类型的列表。我的问题是我正在创建一个套接字服务,它接收数据并对列表进行检查,如果它不存在,那么它传递要处理的数据并将数据ID号添加到列表中,这样相同的数据就不会再次处理(处理数据的服务不知道是否存在重复工作,因此这将作为过滤器)。
我读到arraylist很快但我刚才意识到它需要我知道之前列表的大小,我不会随着它不断增长(它肯定会达到数十亿个项目)。我以为我会使用旧时尚整数[],但我想我会问是否有更好的方法。
与我的过程相关的细节很少,我的数据本身很复杂但是对于查找我将数据转换为哈希码并检查,因此我的所有数据都是整数(正/负)和服务客户端请求是通过runnable完成的,所以如果我能做些什么来提高数据的效率我可以这样做(我在想,因为它的所有整数可能经常对它进行排序以使循环更快?)。整数[]是否足够好还是有更好的东西?
答案 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
。那可能会更快。
此外,由于项目很大,我建议使用LinkedHashMap
和HashMap
进行一些缓存。这将加快流程,因为LinkedHashMap
会将经常出现的项目存储在其优先级Q中。
答案 3 :(得分:1)
如果您已经对数据进行哈希处理,为什么不使用其中一个哈希集合,例如: HashSet或HashMap而不是列表?