关于Dart不可变集合创建及时间复杂度的三类技术疑问
Dart不可变集合相关问题解答
问题1:List.unmodifiable(someList)和Map.unmodifiable(someMap)是创建不可变视图还是独立集合?
我可以明确告诉你,这两个方法创建的是全新的独立不可变集合,而非原集合的视图。它们会把原集合中的所有元素/键值对复制到新的不可变集合实例中,后续修改原集合的内容,完全不会影响这个通过unmodifiable创建的集合。
问题2:如果上述方法创建的是独立集合,有没有方式创建不可变视图以提升性能?
没错,你找到的UnmodifiableListView<E>正是解决这个问题的关键!除此之外,Dart还提供了UnmodifiableMapView<K, V>用于Map场景。这两个类都是原集合的不可变视图:
- 它们不会复制原集合的元素,只是对原集合做一层包装,创建时的性能开销极低
- 视图本身不支持任何修改操作(比如
add、remove、clear等) - 但如果原集合被修改,视图的内容会同步变化——因为它本质上只是原集合的“只读窗口”
问题3:从现有集合创建Dart集合的时间复杂度(Big O)是多少?
我们分不同场景来看:
List.unmodifiable(someList)、List.from(someList)这类需要复制元素的方法:时间复杂度是O(n),其中n是原集合的元素数量。因为需要遍历原集合的每一个元素并复制到新集合中,和Java中new ArrayList<>(existingList)的复杂度一致。Map.unmodifiable(someMap)、Map.from(someMap)这类复制键值对的方法:时间复杂度是O(m),其中m是原Map的键值对数量。理由和List的情况类似,需要遍历所有键值对完成复制,对应Java中new HashMap<>(existingMap)的复杂度。UnmodifiableListView<E>、UnmodifiableMapView<K, V>这类视图类:时间复杂度是O(1),因为它们只是对原集合做一层包装,不需要复制任何元素或键值对,创建过程几乎没有性能开销。
内容的提问来源于stack exchange,提问作者Marcelo Glasberg
相关产品推荐
相关产品推荐

