首页 > 解决方案 > List中的[]和elementAt有什么区别?

问题描述

var ints = [0, 1, 2, 3];
var foo = ints.elementAt(1);
var bar = ints[1];
assert(foo == bar);

elementAt和操作员都[]做同样的工作。两者之间有什么区别,如果没有,那么当我们可以使用它们时,为什么[]在类中没有定义?IterableelementAt

标签: dart

解决方案


那么为什么我们可以在类上使用时没有[]定义呢?IterableelementAt

你已经回答了你自己的问题:不同之处在于它elementAt是为所有Iterables 定义的,而operator []不是。

在大多数语言中,[]通常预计会很快:通常是 O(1) 或 O(log n)。允许[]访问链表的元素在技术上是可行的,但这通常不是一个好主意,因为它会使潜在的性能问题变得不那么明显。大多数人不会期望someCollection[99]执行 100 次迭代。

相反,elementAt不做任何此类保证

可以按迭代顺序遍历元素,忽略第一个index元素,然后返回下一个。一些可迭代对象可能有更有效的方法来查找元素。

所以任何人Iterable总是可以提供一个elementAt实现,这不一定很快,但只有可以提供有效实现的派生类才应该提供operator []. 对于这样的类,elementAt应该[] 一样的。


推荐阅读