为什么 Scala 列表没有大小字段?
2022-09-01 15:18:50
来自Java背景,我想知道为什么在Scala中没有像Java等效物这样的领域。毕竟,使用大小字段,您将能够在常量时间内确定列表的大小,那么为什么大小字段被删除了呢?List
size
LinkedList
(这个问题指的是 Scala 2.8 及更高版本中的新集合类。另外,我指的是不可变的,而不是可变的。List
来自Java背景,我想知道为什么在Scala中没有像Java等效物这样的领域。毕竟,使用大小字段,您将能够在常量时间内确定列表的大小,那么为什么大小字段被删除了呢?List
size
LinkedList
(这个问题指的是 Scala 2.8 及更高版本中的新集合类。另外,我指的是不可变的,而不是可变的。List
人们不能说大小字段被删除了,因为这种没有大小的列表自LISP以来已经存在了50年,它们无处不在,它们在ML和Haskell中也很常见,两者都在scala中具有影响力。
基本原因是列表是递归结构。非空是 — 除了实际上调用 Cons 以允许方便的中缀表示法。您可以访问尾部(没有其head元素的列表),这也是一个列表。这几乎一直在做。因此,在列表中有计数并不意味着只添加一个整数,而是与元素一样多的整数。这是可行的,但肯定不是免费的。List
Cons(head: A, tail: List[A])
::
如果你与java的相比,有一个递归实现(基于Node,它或多或少像Cons,但在两个方向上都有链接)。但是LinkedList不是一个节点,它拥有它们(并保持它们的计数)。因此,虽然它具有递归实现,但您不能以递归方式处理它。如果你想要一个LinkedList的尾部作为LinkedList,你必须删除标题并更改你的列表,或者将所有尾部元素复制到一个新的LinkedList。所以 scala 和 java 是截然不同的结构。LinkedList
LinkedList
List
LinkedList
因为维护此字段将
在Java中,通常创建a,然后通过添加/删除元素来操作而不创建新列表;在Scala中,有许多s创建。LinkedList
List
因此,决定开销不值得。