2012-04-16 53 views
0

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

我看到ArrayList速度很快,但我只是意识到它需要我知道列表的大小,而不是随着它的不断增长(它肯定会触及数十亿个物品)。我以为我会用旧的时尚整数[],但认为我会问是否有更好的方法。

有几个细节与我的过程有关,我的数据本身很复杂,但对于查找,我将数据转换为散列码并检查这些数据以便我所有的数据都是整数(正数/负数)以及客户端请求是通过可运行的程序来完成的,所以如果我能做些事情来提高数据的效率,我可以做到这一点(我在想,因为它的所有Integers可能经常对它进行排序以使循环更快?)。是整数[]足够好还是有更好的?

+1

我希望它不会超过2,147,483,647项。那么你会遇到比选择哪种类型的列表更大的问题。 – Jeffrey 2012-04-16 01:34:35

+0

@Jeffrey我会保持我的手指交叉它不:-) – Lostsoul 2012-04-16 01:35:16

+0

你应该使用一个Set而不是List来避免重复。 – Hassan 2012-04-16 01:38:41

回答

1

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

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

2
it will surely hit several billion items 

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

如果你真的有数十亿件物品,我建议把它们保存在数据库而不是内存中。你当然可以在内存中缓存一个子集来加快查询速度,但是长期的解决方案是一个数据库,即使服务器出现故障,数据库也会保留值。

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

+0

坚持+1 – Korinna 2012-04-16 05:04:12

1

那么,如果你想检查宝贵的物品,那么无论哪种方式,你将不得不存储所有的物品。我会建议使用HaspMap。此外,如果可能不够,您可以使用多个hashmaps

您可以轻松地做

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

使用一个以上的hashmap检查,如果你认为该项目可以基于什么区别。这可能会更快。 此外,由于项目很大,我建议使用LinkedHashMap以及HashMap来做一些缓存。这将加速该过程,因为LinkedHashMap会将经常出现的项目存储在其优先级Q中。

1

如果您已经哈希数据,为什么不使用哈希集合中的一个例如HashSet或HashMap而不是列表?