【问题标题】:Iterate through List or get Object by index from List?遍历列表或从列表中按索引获取对象?
【发布时间】:2015-01-27 13:35:57
【问题描述】:

好的,例如我有 Arena 类并将它们添加到列表中,我需要通过一个参数获取 Arena。遍历每个对象或从列表中获取它们更有效?哪种方式效率更高?

public Arena getArena(String param) {
    List<Arena> arenas = ...;
    for(Arena arena : arenas) {
        if(arena.getParameter().equals(param)) return arena;
    }
}

或

public Arena getArena(String param) {
    List<Arena> arenas = ...;
    for(int i = 0; i < arenas.size(); i++) {
        if(arenas.get(i).getParameter().equals(param)) return arenas.get(i);
    }
}

【问题讨论】:

  • 我不知道你是否注意到了,但是在第二个 sn-p 中,你也遍历了每个对象。所以......我不明白为什么任何应该更有效。如果 id 是唯一的并且参数不一定是第二个,那么第二个更安全,但是 ...
  • @Ascalonian 我认为它们在方法上相似,但是根据问题的标题,benR 无法找到它。
  • @NealC - 只是一个简单的谷歌搜索“Java 对象循环”,这是第一个结果。在发布之前进行一些好的搜索很有帮助(并防止投票和关闭)。

标签: java bukkit


【解决方案1】:

这取决于您使用的 List 实现是否具有随机访问(例如 ArrayList)或没有(例如 LinkedList)。

如果它没有随机访问,则第二个选项的效率会降低,因为 arenas.get(i) 需要从列表的开头(或结尾)迭代到请求的索引。

如果是随机访问列表,两个选项的运行时间相似,但第一个看起来更干净。

【讨论】:

    【解决方案2】:

    在我看来,最好的方法是使用HashMap,因为你可以在 O(1) 处获得元素。 但是您需要将区域添加到哈希映射而不是列表。

    看这个例子:

    public Arena getArena(String param) {
        HashMap<String, Arena> arenasHash = ...;
        return arenasHash.get(param);
    }
    

    【讨论】:

    • 请注意,HashMap 不保留添加条目的顺序。因此,如果我们希望第一个 Arena 具有参数 param,我们应该使用 LinkedHashMap 或 ImmutableMap 代替,因为它们保持顺序。
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2011-08-19
    • 2018-05-08
    相关资源
    最近更新 更多