当前位置: 首页 > 面试题库 >

为什么Scala列表没有size字段?

司马辉
2023-03-14
问题内容

来自Java背景,我想知道为什么ListScala中没有size类似Java
的字段LinkedList。毕竟,使用size字段,您将能够确定时间的列表大小,那么为什么size字段被删除了?

(此问题涉及Scala 2.8及更高版本中的新集合类。此外,我指的是不可变的List,而不是可变的。)


问题答案:

不能说size字段已被 删除
,因为LISP自LISP以来已经存在了50年,这种列表无处不在,并且它们在ML和Haskell中也很常见,两者在scala中都很重要。

根本原因是列表是递归结构。非空值List是一个事实Cons(head: A, tail: List[A])-除了实际上调用Cons::允许使用方便的中缀表示法。您可以访问尾部(不包含head元素的列表),这也是一个列表。而且,几乎所有时间都是如此。因此,在列表中包含计数并不意味着要添加一个整数,而是要与元素个数一样多。这是可行的,但肯定不是免费的。

如果与java的比较LinkedListLinkedList则具有递归实现(基于Node,它或多或少类似于Cons,但是双向都有链接)。但是LinkedList不是Node,它拥有它们(并保留它们的计数)。因此,尽管它具有递归实现,但是您不能递归对待它。如果您希望将LinkedList的尾部作为LinkedList,则必须删除头部并更改列表,或者将所有tail元素复制到新的LinkedList中。因此,scala
List和java的LinkedList结构非常不同。



 类似资料:
  • 问题内容: 我当时正在编写一个简短的脚本来更改元素的内部文本,但是发现它没有方法。我知道那不是继承自,但似乎不是一种有用的方法吗?是否有一个具体的实施问题,我不知道阻止添加的到? 注意:我知道Dojo和jQuery 的节点列表都有某种形式。由于限制,我无法使用任何一个。 问题答案: 现在,NodeList在所有主要浏览器中都具有forEach() 原始答案 这些答案都不能解释 为什么 NodeLi

  • 问题内容: 有谁知道为什么不调用Python的函数,因为已经有一个可以删除并返回最后一个元素(索引为-1)并且语义与该用法一致的原因? 问题答案: 因为“ append”早在想到“ pop”之前就已存在。受Python 0.9.1 支持的list.append于1991年初。通过比较,这是在comp.lang.python上讨论的有关在1997年添加pop的一部分。Guido写道: 为了实现一个堆

  • 我最近在springboot和flyway一起工作,我有这样一个问题。为什么flyway没有创建数据库?我刚刚在我的build.gradle中添加了一个flyway依赖项,现在看起来是这样的。 我这样配置数据源: 这里是我的Hibernate。属性: 和迁移文件,位于resources/db/migration中: 有什么问题?是否应该在Application.Properties中配置datas

  • 问题内容: 在C ++中,可以在构造函数开始运行之前使用初始化列表来初始化类的字段。例如: 我很好奇为什么Java没有类似的功能。根据 Core Java:第1卷 : C ++使用这种特殊语法来调用字段构造函数。在Java中,因为对象没有子对象,而只有指向其他对象的指针,所以不需要它。 这是我的问题: “由于对象没有子对象”是什么意思?我不知道什么是子对象(我尝试查找它);它们是否意味着扩展超类的

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):

  • 许多编译器都提供128位整数类型,但我使用过的编译器都没有提供typedefs。为什么? 据我回忆,标准 用于此目的的储量 鼓励提供此类类型的实现提供typedef 要求此类实现提供至少128位的intmax_t (而且,我不相信我使用了实际上符合最后一点的实现)