遍历 List 还是从 List 中通过索引获取对象?
Iterate through List or get Object by index from List?
好的,例如我有 class 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);
}
}
这取决于您使用的 List 实现是否具有随机访问(例如 ArrayList)或没有(例如 LinkedList)。
如果它没有随机访问,第二个选项的效率会较低,因为 arenas.get(i) 需要从列表的开头(或结尾)迭代到请求的索引.
如果是随机访问列表,两个选项的 运行 次相似,但第一个看起来干净得多。
我认为最好的方法是使用 HashMap
,因为您可以获得 O(1) 的元素。
但是你需要将区域添加到哈希映射而不是列表。
看这个例子:
public Arena getArena(String param) {
HashMap<String, Arena> arenasHash = ...;
return arenasHash.get(param);
}
好的,例如我有 class 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);
}
}
这取决于您使用的 List 实现是否具有随机访问(例如 ArrayList)或没有(例如 LinkedList)。
如果它没有随机访问,第二个选项的效率会较低,因为 arenas.get(i) 需要从列表的开头(或结尾)迭代到请求的索引.
如果是随机访问列表,两个选项的 运行 次相似,但第一个看起来干净得多。
我认为最好的方法是使用 HashMap
,因为您可以获得 O(1) 的元素。
但是你需要将区域添加到哈希映射而不是列表。
看这个例子:
public Arena getArena(String param) {
HashMap<String, Arena> arenasHash = ...;
return arenasHash.get(param);
}