我们为 Map 获得的实际实例是什么?

What is the actual instance we get for a Map?

如果我像这样创建一个Map

Map<String, dynamic> map = Map<String, dynamic>();

在文档中说,它 returns LinkedHashMap

  /// Creates an empty [LinkedHashMap].
  ///
  /// This constructor is equivalent to the non-const map literal `<K,V>{}`.
  ///
  /// A `LinkedHashMap` requires the keys to implement compatible
  /// `operator==` and `hashCode`.
  /// It iterates in key insertion order.
  external factory Map();

LinkedHashMap也是一个抽象class,我们不能在dart中为抽象class创建对象。

abstract class LinkedHashMap<K, V> implements Map<K, V> {
  /// Creates an insertion-ordered hash-table based [Map].
  ///

我们在Map构造函数中得到的实际实例是什么? 我使用的是 dart version 2.16.1 latest stable

What is the actual instance we get in Map Constructor?

答案是LinkedHashMap。是具体的class,不是抽象的class。

LinkedHashMap

implementers of Map 的另一个示例是 HashMap

Map 默认构造函数是一个 factory constructor,它使用其默认构造函数生成 LinkedHashMapLinkedHashMap 默认构造函数也是一个工厂构造函数,它创建了几个内部 类:

之一的对象
  • _InternalLinkedHashMap
  • _CompactLinkedIdentityHashMap
  • _CompactLinkedCustomHashMap

至于选择哪一种,那要看提供了什么样的equalshashCodeisValidKey方法。对于您调用 Map() 的情况,它将是第一个 _InternalLinkedHashMap

源代码

这是我提到的 类 和构造函数的最新版本(截至今天):