我对效率有疑问。
说我有一个简单对象列表Foo
public class Foo {
Integer id;
List<String> data;
...
}
现在我有一个foo类列表
List<Foo> fooList = new ArrayList<Foo>();
假设我有数千条记录的集合,我需要将它们添加到此列表中,但是当我遇到已添加到列表中的id时,我需要附加foo.data列表而不是添加新的具有重复ID的foo。
为每个独特的foo创建一个地图是明智的。我会遇到这样的
Map<Integer, Foo> uniqueFoos = new HashMap<Integer, Foo>();
当我迭代我的数千条记录时,我只需在地图上执行检查,看看foo.id是否已经存在
if(uniqueFoos.containes(record.id))
uniqueFoos.getFoo().add(record.data)
else
uniqueFoos.add(record.id, record)
一旦我将所有记录添加到地图中,我就会迭代地图并将每个Foos添加到列表中
for(Foos f: uniqueFoos)
fooList.add(fooInMap.get(f))
或者我应该一起废弃Map
想法。迭代fooList
并搜索它是否已包含与record.id匹配的foo.id
会更有效吗?或者甚至可以使用ArrayList.contains(...)
方法?我觉得与地图方式相比,这样做效率会低得多。
更新:有些人提到过使用套装。那么Set是否可以覆盖所有其他列出的选项?
注意:我在这里写的代码只是伪代码。
答案 0 :(得分:0)
HashMap绝对是更好的选择。它将在O(1)中进行查找,而List是O(n)。
因此,如果您需要查找和修改单个元素,请使用HashMap。
答案 1 :(得分:0)
如果不对您的代码进行分析,确实很难说。但是,哈希映射的随机访问需要花费一定的时间(大多数时候 - 如果没有冲突),而迭代数组总是线性的。
答案 2 :(得分:0)
当你拥有数千条记录时,你绝对应该使用Map
。
您的示例uniqueFoos.getFoo().add(record.data)
无法编译
它应该是uniqueFoos.get(record.id).add(record.data)
。
要防止在地图中进行双重查找,您的代码应为:
Foo foo = uniqueFoos.get(record.id);
if (foo == null) // not found
uniqueFoos.add(record.id, record);
else
foo.add(record.data);