Java 列表迭代,哪个是最有效的?

Java 列表迭代,哪个是最有效的?,java,performance,collections,Java,Performance,Collections,我正在开发一个游戏,有几个客户存储在ArrayList中,每个客户都有自己的唯一ID,该ID作为变量保存在对象中 如果我想使用客户ID从列表中检索客户,以下哪种做法更好 遍历列表中的所有客户,直到找到匹配的客户 将列表转换为键(ID)和值(客户)的HashMap,然后只需使用.get()方法。也许这和选项一完全一样 HashMap将更有效(在大多数情况下是O(1),在最坏的情况下是O(n)),在列表上迭代将是O(n) 当然,这取决于数据的大小,如果数据量很大,那么HashMap是一个明显的选择,

我正在开发一个游戏,有几个客户存储在ArrayList中,每个客户都有自己的唯一ID,该ID作为变量保存在对象中

如果我想使用客户ID从列表中检索客户,以下哪种做法更好

  • 遍历列表中的所有客户,直到找到匹配的客户

  • 将列表转换为键(ID)和值(客户)的HashMap,然后只需使用.get()方法。也许这和选项一完全一样


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


    当然,这取决于数据的大小,如果数据量很大,那么
    HashMap
    是一个明显的选择,如果数据量很少(例如5个或10个),那么
    列表可能更有效-这里必须考虑常量因素,哪个大Oh符号会忽略。

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

    编辑:
    我支持Jägermeister的这一点,您应该等待性能提升,并将其作为最后一步。

    正如其他人所写,名称中带有“hash”的集合通常为某些类型的操作提供改进的性能属性

    但是请记住一条非常古老的规则,即不要过早地进行优化。严肃地说:除非我们谈论的是“真正的生产设置”;还有10000多名付费客户。。。然后您应该明白,您应该更加关注良好的设计,创建可读+可维护的代码,而不是潜在的性能问题

    是的,我们应该避免完全愚蠢的设计;但问题是:如果你过于关注绩效,过早关注绩效,你将面临两个风险:

    a) 缺少真正的瓶颈。如果您真的遇到性能问题,您需要对应用程序进行配置,以了解时间花在哪里。人们往往认为他们的问题是X;然后他们花了很多时间修复X——后来发现实时编译器对X的地址处理得足够好;而他们真正的问题是他们从未想到过的其他问题


    b) 把自己弄到一个角落里。问题是:好的设计需要能够进化和改变。如果你假设你必须做这个或那个来保存一些神圣的表演圣杯。。。很可能这会对您的整个应用程序产生负面影响。

    我知道您的问题很具体,但我将提出另一种解决方案

    在众多客户的支持下,打造自己的套装。插入客户后,客户ID将设置为放置到阵列中时获得的实际索引


    这样,您就可以使用客户ID直接访问所有客户。

    您认为这样做更好吗,至于是否值得我制作HashMap?我认为使用
    HashMap
    也更容易,并且在您描述的情况下会产生更干净的代码。这还取决于您必须按ID访问元素的次数。如果每次需要按ID访问元素时都将列表转换为映射,当然,这比在列表上迭代要糟糕得多。所以,如果你使用地图,要确保它是一次性创建的,而不是每次你寻找一个元素的时候。这取决于事物的规模。当你设计时,总是要考虑比例。考虑如果你有一百万个条目。如果你需要经常这样做的话,两者之间的差异可能是显而易见的。如果你只需要做一次,那可能没关系。为不接受答案道歉。我已经接受了Krzysztof的观点,我觉得它最直接地解决了这个问题,但也将你的观点提升为最详细、最有帮助的观点。没有必要感到抱歉。是你的决定回答了你的问题!投票也不错;-)