5

因此,例如,假设我有以下课程

class Foo{
  String id;
  Foo(this.id);
}

我想要某种 Foo 的集合,然后能够通过 Foo 的 id 找到任何 Foo。我想比较这两种实现方式:

使用地图:

var foosMap  = <String, Foo>{"foo1": new Foo("foo1"), "foo2": new Foo("foo2")}; 
var foo2 = foosMap["foo2"];

有一个列表:

var foosList = <Foo>[new Foo("foo1"), new Foo("foo2")];
var foo2 = foosList.singleWhere((i) => i.id == "foo2");

第一种方式(使用地图)在性能方面是否更方便?还有其他需要考虑的因素吗?

4

1 回答 1

9

这实际上取决于您正在搜索的项目数量。如果您知道大 O 表示法,从映射中检索值是 O(1) 或常数时间,而在列表中线性搜索是 O(n) 或线性时间。这意味着无论一个地图中没有多少元素,查找时间都是相同的,但是列表的查找时间会随着元素数量的增加而增加。

因为很多程序员都使用哈希映射,而对于非常小的集合,列表通常更快。如果您曾经查看执行查找的性能关键代码,您有时会看到切换到列表而不是小型集合的映射的特殊情况。知道这是否是一个好策略的唯一方法是进行性能测试。

速度不是一切,而且我更喜欢在许多情况下地图语法的清晰性,假设你已经有一张地图。如果您必须构建地图只是为了执行查找,那么singleWhere()或者firstWhere()很棒。

于 2013-03-20T04:25:37.780 回答