搜索地图与列表

时间:2016-05-09 17:37:36

标签: java performance list dictionary

我对效率有疑问。

说我有一个简单对象列表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是否可以覆盖所有其他列出的选项?

注意:我在这里写的代码只是伪代码。

3 个答案:

答案 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);