列表迭代,哪个最有效?

时间:2016-06-05 07:43:57

标签: java performance collections

我正在开发一款游戏,并将多个客户存储在ArrayList中,每个客户都有自己唯一的ID,并将其保存为对象内的变量。

如果我想使用他们的ID从列表中检索客户,哪种更好的做法?

  1. 遍历列表中的所有客户,直至找到匹配项。

  2. 将列表转换为键的HashMap(ID)和值(客户),然后只使用.get()方法。也许这与选项1完全相同?

4 个答案:

答案 0 :(得分:6)

HashMap将更有效(在大多数情况下为O(1),在最坏的情况下为O(n)),迭代列表将为O(n)。

当然这取决于数据的大小,如果你有很多数据,那么HashMap是显而易见的选择,如果你的数量很少(例如5个可能是10个),那么可能就是{ {1}}会更有效率 - 这里必须考虑常数因素,Big-Oh表示法忽略了这一点。

答案 1 :(得分:1)

正如其他人所写,其名称中包含“hash”的集合通常会为某些操作提供改进的性能属性。

但请记住不要过早优化的旧规则。说真的:除非我们正在谈论“真正的生产设置”;和10 000多个付费客户......那么你应该明白,你应该更多专注于良好的设计,并创建可读和可维护的代码,而不是潜在的性能问题。

是的,应该避免完全愚蠢的设计;但问题是:如果你过于关注和过早地关注绩效,你就冒了两件事:

a)错过了真正的瓶颈。如果您确实遇到性能问题,则可以配置文件您的应用程序,以了解花费的时间。人们常常假设他们的问题是X;然后他们花了很多时间来修复X - 以后发现实际上Just-in-Time编译器对X足够好了;并且他们真正的问题是他们从未想过的其他Y.

b)把自己放在角落里。事情是:良好的设计需要能够发展和变化。如果您假设必须这样做或那样做以保留一些神圣的表现......这可能会对您的整体申请产生负面影响。

答案 2 :(得分:0)

散列映射和所有排序列表可以使用索引更快地找到正确的项目。它可以在中间选择一个索引,如果它所寻找的值更高或更低,它可以使用该信息并在较低或较高的一半中选择一个新索引并重复与之前相同的任务。这减少了查找项目的时间。它被称为二进制搜索(thx fabian) 您可以尝试并比较结果!

修改 我和Jägermeister在一起,你应该等待表演并将其作为最后一步。

答案 3 :(得分:0)

我知道你的问题是具体的,但我会提出另一个解决方案。

构建自己的集合,由一组Costumers支持。插入Costumer后,客户的ID将被设置为放入阵列时获得的实际索引。

通过这种方式,您可以使用他们的ID直接访问所有客户。