DART内置了对List、Set和Map等集合的支持.DART有不同的Map实现.了解不同实现之间的利弊可以帮助您做出明智的决策.
(注:这是在DART M3前后编写的,因此以下内容可能与此时的文档不匹配.)
映射是一个关联容器,将键映射到值.键是唯一的,可以指向且只能指向一个值.键不能为空,但值可以为空.
Dart支持Map literals,如下所示:
var accounts = {'323525': 'John Smith', '588982': 'Alice Jones'};
该规范规定,映射文字必须保持插入顺序.这意味着accounts
是LinkedHashMap
的一个实例.
规范还规定映射文字键必须是字符串.这在future 可能会改变.
DART支持工厂构造函数,因此您可以创建一个新的Map实例,如下所示:
var accounts = new Map();
Map
类是抽象的,这意味着工厂构造函数实际上创建了Map
子类的一个实例.那么accounts
的实际类型是什么呢?
早期版本的DART从new Map()
构造函数创建了HashMap
的新实例.然而,Dart bug 5803声明为了使{}
和new Map
返回相同的类型,new Map
将很快返回LinkedHashMap
的实例.
LinkedHashMap
按插入键和值的相同顺序迭代键和值.
Note: LinkedHashMap可能会重命名为InsertionOrderedMap.跟随Dart bug 2349前进.
下面是一个例子:
import 'dart:collection';
main() {
var ordered = new LinkedHashMap();
ordered['32352'] = 'Alice';
ordered['95594'] = 'Bob';
for (var key in ordered.keys) {
print(key);
}
// guaranteed to print 32352, then 95594
}
这是source code for LinkedHashMap美元.(如果此链接停止工作,很可能是因为类被重命名)
HashMap不能保证保持插入顺序.当您遍历HashMap的键或值时,不能期望有特定的顺序.
HashMap是使用hash table实现的.
以下是创建新HashMap的示例:
import 'dart:collection';
main() {
var accounts = new HashMap();
}
如果您不关心保持插入顺序,可以使用HashMap.
展开树是一种自平衡二叉搜索树,具有最近访问的元素可以快速再次访问的附加属性.它在O(log(N))分期时间内执行插入、查找和删除等基本操作.
import 'dart:collection';
main() {
var accounts = new SplayTreeMap();
}
SplayTreeMap要求所有键的类型相同.
展开树是存储和访问频繁的数据(如缓存)的理想 Select .原因是它们使用树旋转将元素带到根,以便更频繁地访问.性能来自于树的self 优化.也就是说,频繁访问的元素将移动到更靠近顶部的位置.但是,如果树周围的访问量相等,那么使用Splay树映射就没有什么意义了.
一个例子是以非常高的速率接收网络数据包的调制解调器路由.调制解调器必须决定哪个分组进入哪条线路.它可以使用键为IP、值为目的地的MAP实现.展开树映射对于此场景是一个很好的 Select ,因为大多数IP地址将被多次使用,因此可以从树的根找到这些地址.