Scala 面试问题

在閱讀本文之前,請瀏覽我的前篇文章「 Scala Basic Interview Questions and Answers」以獲得一些關於 Scala 語言的基本知識。在本文中,我們將討論一些對一些經驗豐富的 Scala 開發人員有用的 Scala 面試問題和答案。 ** 注意:-** 因為這個列表已經變得非常大,我將提供另一個文章與剩餘的問題和答案。 請參閱此篇文章在「Scala Intermediate and Advanced Interview Questions and Answers

Scala 面试问题

在本节中,我们将列出所有Scala中间面试问题,在下一节中,我们将详细讨论它们。

  1. 联合国 什么是主构造器? 斯卡拉的二级或辅助构造器是什么
  2. 斯卡拉的辅助构造器有什么用? 请解释在斯卡拉定义辅助构造器时应遵循的规则?
  3. 斯卡拉的Array和ArrayBuffer有什么区别?
  4. 办案课是什么? 案件对象是什么? 案例类的优点是什么? ( (英语). 5. 大小写对象和对象( 普通对象) 有什么区别 ?
  5. 与正常类相比,案例类有哪些主要好处? (_) (英语). 7. "Instanceof"和"Instanceof"方法在斯卡拉的用法是什么? Java 有类似的概念吗?
  6. 您如何证明默认情况下, Case Object 是可序列的, 而正常对象不是 ? ( ) (英语). 9. Scala 中的矩阵和列表的差异( ) )10 (英语). 斯卡拉的"val"和"lazy val"有什么区别?. 什么是Eager评价? 懒惰评价是什么? 11 (英语). 斯卡拉的"等同法"和"等同法"的关系是什么?. 区别斯卡拉的"=="和"Java"的" Operator"操作? (). )12 (英语). 斯卡拉的"内科"与"爪哇"的"内科"的区别? () )13 (英语). 什么是钻石问题? 斯卡拉如何解决钻石问题? 14 (英语). 为什么斯卡拉没有"静态"关键词?. 作出这一决定的主要原因是什么? () (英语). 15. 斯卡拉语中"对象"关键词有什么用?. 如何在 Scala 中创建 Singleton 对象 ? 16 (英语). 如何使用 Scala 中的对象关键词定义工厂方法? 在对象中定义工厂方法有什么用? () )17 (英语). 斯卡拉有什么应用方法? 在斯卡拉什么是不适用的方法? 在斯卡拉,应用方法和不适用方法有什么区别? () )18 (英语). 当我们在斯卡拉创建一个没有使用"新"关键词的类例时,它如何运作? 我们何时采取这种办法? 19 (英语). 我们如何在斯卡拉宣布一个私人初级建筑师? 我们如何给斯卡拉的私人初级建筑师打电话? () )20 (英语). 同伴是否反对访问它在斯卡拉的私人会员(companyon class)? () )21 (英语). 关于两个独立的关键词:类和对象在斯卡拉的主要设计决定是什么? 我们如何定义斯卡拉的Stractory成员和静态成员? 22 (英语). 斯卡拉的物体是什么? 它是单通对象还是类实例? 23 (英语). 斯卡拉的同伴对象是什么? 斯卡拉的同伴课是什么? Scala 中同伴对象的用途是什么( ) )24 (英语). 如何在 Scala 中执行接口? () )25 (英语). 斯卡拉的兰克是什么? 如何在斯卡拉创建 Range ? 26 (英语). Scala 有多少类型无值 ? () )27 (英语). 类型单位在斯卡拉有多少个值( ) ? )28 (英语). 斯卡拉的兰克是什么? 如何在斯卡拉创建 Range ? 29 (英语). 在FP中,函数与程序有什么区别? () )30 (英语). 斯卡拉的辅助构造器和爪哇的构造器有什么主要区别? () )31 (英语). Scala 用于综合构造的 关键字有什么用 ? () ) 32 (英语). 斯卡拉的"通判"构造中有什么防守? ( (英语). 33. 斯卡拉如何比Java 8自动和轻松地解决继承钻石问题?
  7. 在斯卡拉语中,模式匹配遵循的是哪个设计模式? 在 Java 中, Intanceof 运算符遵循哪个设计模式 ? (_) (英语)

Scala 面试问题与答案

在本节中,我们将从上面的列表中提取每一个问题,并详细讨论适当的示例(如果需要的话)。

什么是初级建设者? Scala 中的二级建设者或辅助建设者? Scala 中的辅助建设者有什么用途? Scala 中的建设者是否可以过载?

Scala有两种类型的建设者:

  • 主要建造者
  • 辅助建造者

在 Scala 中,Primary Constructor 是由类本身定义的建设者,每个类必须有一个主要建设者:或参数建设者,或无参数建设者。

1class Person

上方的人类有一个零参数或无参数或无参数主要构建器来创建该类的实例。

1class Person (firstName: String, lastName: String)

上方的人类有两个参数主要构建器来创建该类的实例。 ** 辅助构建器** 辅助构建器也被称为辅助构建器。

1class Person (firstName: String, middleName:String, lastName: String){
2  def this(firstName: String, lastName: String){
3      this(firstName, "", lastName)
4  }
5}

如何在 Scala 中使用辅助构造器?请解释在 Scala 中定义辅助构造器时要遵循的规则?

在Scala中,辅助制造商的主要目的是过载制造商,就像Java一样,我们可以提供各种类型的制造商,以便使用者根据自己的要求选择合适的制造商。

他们只是方法一样。 就像方法一样,我们应该使用def关键字来定义它们

  • 对于所有辅助制造商
  • 我们应该使用相同的名称this
  • 每个辅助制造商应该从先前定义的另一个辅助制造商或主要制造商的呼叫开始。 否则,编译时间错误
  • 每个辅助制造商应该与其参数列表不同:可以是通过数字或类型
  • 辅助制造商不能呼叫一个超级类制造商。 他们只能通过主要制造商呼叫他们
  • 所有辅助制造商直接或间接地通过其他辅助制造商呼

** 注: 如果您想了解 Scala 的制造商,请参阅我的 Scala 文章: Primary ConstructorAuxiliary Constructor

在 Scala 中 Array 和 ArrayBuffer 的区别是什么?

在 Scala 中 Array 和 ArrayBuffer 的区别:

  • 数组是固定大小的数组. 一旦创建,我们就无法改变其大小.
  • ArrayBuffer是可变大小的数组. 它可以动态地增加或减少其大小.
  • 数组类似于 Java 的原始数组
  • ArrayBuffer类似于 Java 的 ArrayList

什么是案例类?什么是案例对象?案例类的优点是什么?

案例类是用案例类关键字定义的类别。案例对象是用案例对象关键字定义的对象。由于这个案例关键字,我们将获得一些好处,以避免锅炉板代码。我们可以创建案例类对象而不使用关键字。默认情况下, Scala 编译器为所有构建者参数预先定义val。这就是为什么不使用val 或 var,案例类的构建者参数将成为类成员,对于正常类是不可能的。 案例类的优点:

  • 默认情况下, Scala Compiler 会添加 toString、hashCode 和等式方法. 我们可以避免编写这个 boilerplate 代码.
  • 默认情况下, Scala Compiler 会添加伴侣对象,使用应用和未完成的方法,这就是为什么我们不需要新的关键字来创建一个案例类的实例。

案例对象和对象(正常对象)的区别是什么?

  • 使用object关键字创建正常对象. 默认情况下,它是一个单一的对象。
1object MyNormalObject
  • 案例对象是使用案例对象关键字创建的。默认情况下,它也是一个单一的对象
1case object MyCaseObject
  • 默认情况下,案例对象可以使用 toString 和 hashCode 方法,但正常对象不能使用 *默认情况下,案例对象是可 Serializable。

与正常类相比,Case类的主要优点或好处是什么?

以下是 Case 类比正常类的主要优势或优势:

  • 通过自动添加一些有用的方法来避免大量的锅炉板代码
  • 默认情况下,支持不变性,因为其参数是val
  • 易于使用模式匹配
  • 无需使用关键字来创建案例类
  • 默认情况下,支持 Serialization 和 Deserialization

如何在 Scala 中使用 isInstanceOf 和 asInstanceOf 方法?在 Java 中是否有类似的概念?

无论是InstanceOf 或 asInstanceOf 方法都是在任何类中定义的,所以不需要导入以将这些方法导入到任何类或对象中。

1scala> val str = "Hello"
2
3   scala>str.isInstanceOf[String]
4   res0: Boolean = false

asInstanceOf 方法用于将对象投放到给定的类型. 如果给定的对象和类型是相同的类型,那么它投放到给定的类型.否则,它会投放 java.lang.ClassCastException。

1scala> val str = "Hello".asInstanceOf[String]
2 str: String = Hello

在Java中,instanceof关键字类似于Scala的isInstanceOf方法,在Java中,以下类型的手动类型铸造类似于Scala的asInstanceOf方法。

1AccountService service = (AccountService)
2 context.getBean("accountService");

如何证明默认情况对象是可序列化的,而正常对象不是?

是的,默认情况下,案例对象是可序列化的,但正常对象不是。

 1scala> object MyNormalObject
 2defined object MyNormalObject
 3
 4scala> MyNormalObject.isInstanceOf[Serializable]
 5res0: Boolean = false
 6
 7scala> case object MyCaseObject
 8defined object MyCaseObject
 9
10scala> MyCaseObject.isInstanceOf[Serializable]
11res1: Boolean = true

在 Scala 中 Array 和 List 的区别是什么?

  • 数组总是可变,而列表总是不可变
  • 一旦创建,我们可以更改数组值,因为我们不能更改列表对象 *数组是固定大小的数据结构,而列表是可变大小的数据结构。

注:如果你不确定不变和可变,请阅读我的下一篇文章Scala采访问题。

正如我们在我的 Basic Scala 面试问题中所讨论的那样,val是指用于定义不变变量的值或常数。

  • Eager 评估
  • Lazy 评估

懒惰评估意味着在编译时间或程序部署时间对程序进行评估,无论客户是否正在使用该程序,懒惰评估意味着在客户访问该程序时仅对其进行评估,而懒惰懒惰之间的区别在于懒惰被用来定义被急切评估的变量,而懒惰被用来定义变量,但它们被懒惰评估。

在 Scala 中等于方法和 == 的关系是什么? 区分 Scala 的 == 和 Java 的 == 操作员?

在 Scala 中,我们不需要调用 equals() 方法来比较两个实例或对象. 当我们与 == 比较两个实例时,Scala 会自动调用该对象的 equals() 方法.Java 的 == 运算器用于检查 References Equality 即两个引用是否指向相同的对象。

Scala 的内部类和 Java 的内部类的区别是什么?

在Java中,内部类与外部类关联,而外部类是外部类的成员。

钻石问题如何解决?钻石问题如何解决?

A Diamond Problem is a Multiple Inheritance problem. Some people calls this problem as Deadly Diamond Problem. In Scala, it occurs when a Class extends more than one Traits which have same method definition as shown below. scala interview questions Unlike Java 8, Scala solves this diamond problem automatically by following some rules defined in Language. Those rules are called "Class Linearization". Example:-

 1trait A{   
 2  def display(){ println("From A.display")  }
 3}
 4trait B extends A{ 
 5  override def display() { println("From B.display") }
 6}
 7trait C extends A{ 
 8  override def display() { println("From C.display") }
 9}
10class D extends B with C{ }
11
12object ScalaDiamonProblemTest extends App {
13    val d = new D
14    d display
15}

这里的输出是从 C.display的形式特征 C. Scala 编译器从右到左读取扩展B与C,并采取显示方法定义,以免大多数特征是C。

为什么Scala没有静态的关键字?这个决定的主要原因是什么?

正如我们所知道的,斯卡拉根本没有静态的关键字,这是斯卡拉团队的设计决定。做出这一决定的主要原因是将斯卡拉定义为纯对象导向语言。静态关键字意味着我们可以访问该类成员而不创建对象或不使用对象。这完全违背了OOP原则。如果一种语言支持静态的关键字,那么那种语言不是纯对象导向的语言。例如,由于Java支持静态的关键字,它不是纯对象导向的语言,但斯卡拉是一种纯对象导向的语言。

如何在 Scala 中使用object关键字?如何在 Scala 中创建 Singleton 对象?

在 Scala 中,对象关键字用于以下目的:

  • 用于在 Scala 中创建单个对象
1object MySingletonObject

在这里,MySingletonObject 会自动变成 singleton 对象.- 对象关键字用于定义可执行的 Scala 应用程序。

1object MyScalaExecutableProgram{   
2   def main(args: Array[String]){
3       println("Hello World")
4   }
5}

当我们在对象中定义主方法时,如上所示(与Java中的 main()方法相同),它会自动成为一个可执行的 Scala程序.- 它用于定义静态成员,如静态变量和静态方法,而不使用静态关键字。

1object MyScalaStaticMembers{ 
2  val PI: Double = 3.1414  
3  def add(a: Int, b: Int) = a + b
4}

通过 def PI 变量和添加方法将成为静态成员,这意味着我们可以调用它们而不会创建一个单独的对象,如 MyScalaStaticMembers.add(10,20)。- 它用于定义工厂方法。

如何在 Scala 中使用对象关键字来定义工厂方法?对象中定义工厂方法的用途是什么?

在 Scala 中,我们使用对象关键字来定义工厂方法. Scala 中的这些工厂方法的主要目的是避免使用关键字. 没有使用关键字,我们可以创建对象。 ** 要定义工厂方法:** 我们可以使用应用方法在 Scala 中定义工厂方法。

 1class Person(val firstName: String, val middleName: String, val lastName: String){
 2  def this(firstName: String, lastName: String){
 3    this(firstName,"",lastName)
 4  }
 5}
 6object Person{
 7  def apply(val firstName: String, val middleName: String, val lastName: String) 
 8        = new Person(firstName,middleName,lastName)
 9
10  def apply(val firstName: String, val lastName: String) 
11        = new Person(firstName, lastName)
12}

现在我们可以创建 Person 对象,而不使用新的关键字或使用新的关键字,直到您的愿望。

1val p1 = new Person("Scala","Java")
2or 
3val p1 = Person("Scala","Java")

Scala 中的应用方法是什么? Scala 中的应用方法是什么? Scala 中的应用方法和应用方法有什么区别?

在Scala中,应用和未完成方法起着非常重要的作用,它们在Play Framework中也非常有用,用于在表单数据和模型数据之间绘制和卸载数据。

*应用方法:从其组成部分组成或组装一个对象 *未完成的方法:将一个对象分解或分解为其组成部分

Scala的应用方法: 它用来构成一个对象,使用它的组成部分。假设如果我们想要创建一个人对象,然后使用 firstName 和 lastName 两个组成部分,并构成如下所示的人对象。

1class Person(val firstName: String, val lastName: String)
2
3object Person{
4  def apply(firstName: String, lastName: String) 
5        = new Person(firstName, lastName)
6}

** Scala 的未填写方法:** 它被用来将一个对象分解为其组件。 它遵循应用方法的逆转过程. 假设我们有个人的对象,那么我们可以将这个对象分解为它的两个组件: firstName 和 laststName 如下所示。

1class Person(val firstName: String, val lastName: String)
2
3object Person{
4  def apply(firstName: String, lastName: String) 
5        = new Person(firstName, lastName)
6
7    def unapply(p: Person): (String,String) 
8        = (p.firstName, p.lastName)
9}

当我们在Scala中不使用关键字而创建一个Class实例时,它是如何运作的?我们何时采取这种方法?如何在Scala中宣布私人建设者?

在 Scala 中,当我们创建一个类的实例而不使用关键字时,它会内部调用适当的应用方法,可在Companion 对象中使用。

如何在 Scala 中宣布私人初级制造商?如何在 Scala 中调用私人初级制造商?

在 Scala 中,我们可以很容易地宣布一个私人主要制造商。只需定义一个主要制造商,然后在类名称和参数列表之前添加私人:

1class Person private (name: String)
2object Person{
3 def apply(name: String) = new Person(name)
4}

由于它是一个私人制造商,我们不能从外部称呼它,我们应该提供一个工厂方法(即应用方法),如上所示,并间接使用该制造商。

Companion 对象是否可以访问 Scala 中的 Companion 类的私人成员?

在 Scala 中,Companion 对象可以访问其Companion 类的私人成员,Companion 类可以访问其Companion 对象的私人成员,Companion 类可以访问其Companion 对象的私人成员。

关于两个单独的关键字的主要设计决定是什么: Scala 中的类和对象?我们如何在 Scala 中定义实例成员和静态成员?

在Scala中,我们使用类关键字来定义实例成员和对象关键字来定义静态成员 Scala没有静态关键字,但我们仍然可以通过使用对象关键字来定义它们。

什么是 Scala 中的对象? 它是单个对象还是类的实例?

与Java不同的是,Scala对对象有两个含义,不要对此感到困惑,我会清楚地解释它。

像Java一样,对象的第一个含义是一类的实例

1val p1 = new Person("Scala","Java")
2or 
3val p1 = Person("Scala","Java")

*第二个含义是,对象是 Scala 中的关键字,用于定义 Scala Executable 程序、Companion Objects、Singleton Objects 等。

什么是 Scala 中的伴侣对象? Scala 中的伴侣类是什么? Scala 中的伴侣对象的用途是什么?

简单地说,如果一个 Scala 类和对象在相同的源文件中共享相同的名称和定义,那么这个类被称为伴侣类,而那个对象被称为伴侣对象。当我们使用 Scala class 关键字和 Object 使用 Scala object 关键字使用相同的名称和相同的源文件时,那么这个类被称为伴侣类,而那个对象被称为伴侣对象

1class Employee{ }
2object Employee{ }

在 Scala 中,Companion 对象的主要目的是定义应用方法,并避免在创建该 Companion 类对象的实例时使用新关键字。

如何在 Scala 中实现接口?

正如我们从Java背景中所知道的,我们使用界面来定义联系人,然而,Scala中没有界面概念,甚至Scala没有界面关键字,Scala有一个更强大、更灵活的概念,即为此目的的特征。

什么是 Scala 范围?如何创建 Scala 范围?

Range 是 Scala 中的 Lazy Collection。Range 是以scala 包提供的类别,例如scala.Range。它被用来表示整数值的序列。

1scala> 1 to 10
2res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
3
4scala> 1 until 10
5res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

Scala 中有多少种类型的 Nothing 值?

在 Scala 中,Nothing 类型没有为零的值,它没有任何值,它是所有值类和参考类的子类型。

在 Scala 中有多少个单位类型值?

在 Scala 中, Unit 是类似于 Java 的空关键字,用来表示没有值存在

什么是纯功能?

纯函数是一个没有任何可观察的副作用的函数,这意味着它总是返回相同的结果,无论我们用相同的输入来调用它多少次。

1scala> 10 + 20
2res0: Int = 30
3scala>
4scala> 10 + 20
5res0: Int = 30

在这里,+是一个在Int类中可用的纯函数,它给出了相同的输入10和30的相同结果30,无论我们呼叫多少次。

在 FP 中,函数和程序的区别是什么?

两者都是用来执行计算的,但是在功能编程世界中有一个主要的区别:函数是没有副作用的计算单位,而作为程序也是具有副作用的计算单位。

Scala 辅助构造器和 Java 构造器的主要区别是什么?

Scala的辅助构造器与Java的构造器几乎相似,与Java的构造器相比,辅助构造器有以下几个差异:

在Java中,我们使用类名来定义建设者 *每个辅助建设者必须从先前定义的辅助建设者或主要建设者开始呼叫 *我们使用def关键字来定义辅助建设者,如方法/功能定义。

如何在 Scala 的预先理解构建中使用yield关键字?

我们可以在 Scala for-comprehension 构建中使用yield关键字。for/yield用于迭代元素集合,并生成相同类型的新集合。它不会改变原始集合。

1scala> val list = List(1,2,3,4,5)
2list: List[Int] = List(1, 2, 3, 4, 5)
3
4scala> for(l <- list) yield l*2
5res0: List[Int] = List(2, 4, 6, 8, 10)

斯卡拉的预先理解构建中的守护者是什么?

在 Scala 中,for-comprehension 构造有一个 if 条款,用来写一个条件来过滤某些元素并生成新集合。这个 if 条款也被称为守卫。如果那个守卫是真实的,然后将该元素添加到新集合中。

1scala> val list = List(1,2,3,4,5,6,7,8,9,10)
2list: List[Int] = List(1, 2, 3, 4, 5 , 6 , 7 , 8 , 9 , 10)
3
4scala> for(l <- list if l % 2 =0 ) yield l
5res0: List[Int] = List(2, 4, 6, 8, 10)

Scala 如何比 Java 8 更自动、更轻松地解决遗传钻石问题?

如果我们使用Java 8的界面与默认方法,我们将得到继承钻石问题. 开发人员必须在Java 8中手动解决它。 它不提供默认或自动解决这个问题。

在 Scala 中,模式匹配跟随哪个设计模式?在 Java 中,isinstanceof 运算符跟随哪个设计模式?

在Scala中,模式匹配遵循访客设计模式。同样,Java的isinstanceof操作员也遵循访客设计模式。这就是Scala中间面试问题和答案。我们将在我即将到来的帖子中讨论一些高级规模面试问题和答案。如果您喜欢我的帖子或有任何问题 / 建议,请让我发表评论。

Published At
Categories with 技术
comments powered by Disqus