因此,例如,鉴于我有以下课程
class Foo{
String id;
Foo(this.id);
}
Run Code Online (Sandbox Code Playgroud)
我想要某种 Foos 集合,然后能够通过其 id 找到任何 Foo。我想比较这两种实现方式:
带地图:
var foosMap = <String, Foo>{"foo1": new Foo("foo1"), "foo2": new Foo("foo2")};
var foo2 = foosMap["foo2"];
Run Code Online (Sandbox Code Playgroud)
使用列表:
var foosList = <Foo>[new Foo("foo1"), new Foo("foo2")];
var foo2 = foosList.singleWhere((i) => i.id == "foo2");
Run Code Online (Sandbox Code Playgroud)
第一种方式(使用地图)在性能方面是否更方便?还有其他需要考虑的因素吗?
这实际上取决于您正在搜索的项目数量。如果您知道 big-O 表示法,从映射中检索值是 O(1) 或常数时间,而在列表中线性搜索是 O(n) 或线性时间。这意味着无论地图中的元素不多,查找时间都是相同的,但是列表的查找时间随着元素数量的增加而增加。
因为很多程序员都使用哈希映射,而对于非常小的集合列表通常更快。如果您曾经查看过执行查找的性能关键代码,您有时会看到特殊情况下切换到列表而不是小集合的映射。了解这是否是一个好的策略的唯一方法是进行性能测试。
速度不是一切,而且我更喜欢在许多情况下地图语法的清晰性,假设您已经有了地图。如果您必须构建地图只是为了执行查找,那么singleWhere()orfirstWhere()很棒。