Dart中不同的Map实现之间有什么区别?
Dart有一个映射类型,其实现类似于、和。这些不同的地图实现之间有什么区别?Dart内置了对列表、集合和地图等集合的支持。Dart有不同的映射实现。了解实施之间的利弊有助于您做出明智的决策 (注意:这是在Dart M3期间编写的,因此下面的内容可能与当前的文档不匹配。) 什么是地图? 映射是一个关联容器,将关键点映射到值。键是唯一的,并且只能指向一个值。键不能为null,但值可以为null 映射文字 Dart支持,如下所示:Dart中不同的Map实现之间有什么区别?,dart,Dart,Dart有一个映射类型,其实现类似于、和。这些不同的地图实现之间有什么区别?Dart内置了对列表、集合和地图等集合的支持。Dart有不同的映射实现。了解实施之间的利弊有助于您做出明智的决策 (注意:这是在Dart M3期间编写的,因此下面的内容可能与当前的文档不匹配。) 什么是地图? 映射是一个关联容器,将关键点映射到值。键是唯一的,并且只能指向一个值。键不能为null,但值可以为null 映射文字 Dart支持,如下所示: var账户={'323525':'John Smith','58898
var账户={'323525':'John Smith','588982':'Alice Jones'};
规范规定映射文字必须保持插入顺序。这意味着accounts
是LinkedHashMap
的一个实例
该规范还规定映射文字键必须是字符串。这在将来可能会改变
新地图()
Dart支持工厂构造函数,因此您可以创建一个新的Map实例,如下所示:
var accounts=newmap();
Map
类是抽象的,这意味着工厂构造函数实际上创建了Map
子类的实例。那么,账户的实际类型是什么呢
Dart的早期版本从new Map()
构造函数创建了HashMap
的新实例。但是,声明为了使{}
和新映射
返回相同的类型,新映射
将很快返回LinkedHashMap
的实例
LinkedHashMap(或插入OrderedMap)
LinkedHashMap
以插入键和值的相同顺序迭代键和值
注意:LinkedHashMap可能会重命名为InsertionOrderedMap。跟随进步
以下是一个例子:
导入“dart:collection”;
main(){
var ordered=新LinkedHashMap();
有序['32352']='Alice';
有序['95594']='Bob';
for(有序.keys中的变量键){
打印(键);
}
//保证打印32352,然后打印95594
}
这是你的电话号码。(如果此链接停止工作,可能是因为该类已重命名)
哈希图
HashMap不能保证保持插入顺序。在遍历HashMap的键或值时,不能期望有特定的顺序
HashMap是使用
以下是创建新HashMap的示例:
导入“dart:collection”;
main(){
var accounts=newhashmap();
}
如果您不关心维护插入顺序,请使用HashMap
这是你的电话号码
八字树地图
splay树是一种自平衡的二叉搜索树,具有附加属性,最近访问的元素可以快速再次访问。它在O(log(n))摊销时间内执行插入、查找和删除等基本操作
导入“dart:collection”;
main(){
var accounts=新的SplayTreeMap();
}
SplayTreeMap要求所有键的类型相同
对于经常存储和访问的数据(如缓存),splay树是一个很好的选择。原因是他们使用树旋转将元素带到根,以便更频繁地访问。性能来自树的自优化。也就是说,频繁访问的元素会移到更靠近顶部的位置。但是,如果在所有地方访问该树的次数相同,那么使用splay树贴图就没有什么意义了
例如,调制解调器路由器以极高的速率接收网络数据包。调制解调器必须决定哪个数据包进入哪条线路。它可以使用map实现,其中键是IP,值是目的地。对于这种情况,splay树映射是一个很好的选择,因为大多数IP地址将被多次使用,因此可以从树的根目录中找到这些地址。还有一种替代方法
多重映射
import 'package:quiver/collection.dart';
algorithms() {
var ordered = new ListMultimap();
ordered.add('32352', 'Alice');
ordered.add('95594', 'Bob');
ordered.add('32352', 'Alice2');
for (var key in ordered.keys) {
print(key);
}
for (var value in ordered.values) {
print(value);
}
// print in ascending order
// flutter: 32352
// flutter: 95594
// flutter: Alice
// flutter: Alice2
// flutter: Bob
}
有关省道图的关键注意事项
import 'package:quiver/collection.dart';
algorithms() {
var ordered = new ListMultimap();
ordered.add('32352', 'Alice');
ordered.add('95594', 'Bob');
ordered.add('32352', 'Alice2');
for (var key in ordered.keys) {
print(key);
}
for (var value in ordered.values) {
print(value);
}
// print in ascending order
// flutter: 32352
// flutter: 95594
// flutter: Alice
// flutter: Alice2
// flutter: Bob
}
DartMap
是键值对的集合。它将每个键映射到一个值。我们可以在地图上迭代
根据迭代的顺序,有三种类型的映射:
HashMap
是无序的。稍后出现的键值对可以先订购
LinkedHashMap
按插入顺序具有可预测的迭代顺序。稍后出现的键值对将稍后排序
SplayTreeMap
按排序顺序迭代键。它是一个自平衡的二叉树,频繁访问的元素将更靠近树的根
默认情况下,使用Map
构造函数(Map()
,Map.from()
,Map.of())
创建实例将返回LinkedHashMap
无论我们在哪里使用Map
,您都可以考虑LinkedHashMap
,也可以用LinkedHashMap
替换Map
在Dart/FLIFT中创建新地图
使用new关键字,我们可以创建一个新的地图
在使用这些语法之前,不要忘记导入dart:collection library,这些语法包含HashMap
,LinkedHashMap
,SplayTreeMap
,以及本答案其余部分中的其他代码
import 'dart:collection';
main() {
HashMap hashMap = new HashMap<int, String>();
LinkedHashMap linkedHashMap = new LinkedHashMap<int, String>();
SplayTreeMap treeMap = new SplayTreeMap<int, String>();
}
在上面的代码中,我们指定键值对的类型:
您还可以声明映射
,LinkedHashMap
,SplayTreeMap
,而无需设置其键和值的类型。这是什么意思?它不会限制我们在地图中添加
对
这些映射现在接受其他类型:
,
Map map = Map();
HashMap map1 = HashMap();
LinkedHashMap map2 = LinkedHashMap();
SplayTreeMap map3 = SplayTreeMap();
更多:要向八字树添加更多内容:它们用于将元素置于顶部以获得更好的频率