========= 基礎 =========
1 var, val和def三個關鍵字之間的區別?
var immutable variable
val mutable variable
def function defined keyword
2.object 和 class 的區別?
object 單例 無構造器 成員變量和method都是static 可以直接訪問main方法 可以與class同名 構成伴生對象
class 有構造器 需要創建對象 才能在main方法中執行
3.case class (樣本類)是什麼?
經過scala編譯器優化 適合於對不可變數據建模 可用於模式匹配
Case class的每個參數默認以val(不變形式)存在,除非顯式的聲明爲var
自動產生伴生對象,、且半生對象中自動產生appay方法來構建對象
半生對象自動產生unapply方法,提取主構造器的參數進行模式匹配
產生copy方法,來構建一個與現有值相同的新對象
自動產生hashcode,toString,equals方法
默認是可以序列化的,也就是實現了Serializable ;
4 Option , Try和Either三者的區別?
相同:三者內部都包含兩個case class
區別
Option:代表可選值,一個是 Some(代表有值),一個是 None (值爲空);常用於結果可能爲 null 的情況;
Try:運算的結果有兩種情況,一個是運行正常,即 Success ,一個是運行出錯,拋出異常 ,即 Failure ,其中 Failure 裏面包含的是異常的信息;
Either:代表結果有兩種可能 Right 或者 left
5.什麼是函數柯里化
函數可以定義多個參數列表。當使用較少的參數列表調用方法時,這將生成一個將缺少的參數列表作爲參數的函數。如果固定某些參數,將得到接受餘下參數的一個函數
作用:
1.提高適用性,參數複用
2.延遲計算
6、trait (特質)和abstract class (抽象類)的區別?
一個class可以實現多個trait 只能繼承一個abstract class
trait:用於在類之間共享接口和字段。它們類似於Java 8的接口。不能實例化,因此沒有參數。
abstract class 可以定義有參數構造器
7、scala函數中call by name 和call by value的區別
call by name:惰性調用
call by value:多次調用
8、classOf、isInstanceOf、asInstanceOf區別
(1)classOf[T]: 獲取類型T的Class對象
(2)isInstanceOf[T]: 判斷對象是否爲T類型的實例。
(3)asInstanceOf[T]: 強制類型轉換
9、集合的安全
不可變集合是線程安全,多線程可以安全共享其引用。scala會優先採用不可變集合。(http://xiaoxin2009.github.io/Scala%E9%9B%86%E5%90%88.html)
可變集合要安全:
當你從多個線程訪問一個可變集合時,你需要確保自己不會在其他線程正在訪問它時對其修改,scala類庫提供了6個特質,你可以將它們混入集合,這樣在該集合的任何操作完成之前,其他線程纔可能進行另外的操作。
- SynchronizedBuffer
- SynchronizedMap
- SynchronizedPriorityQueue
- SynchronizedQueue
- SynchronizedSet
- SynchronizedStack
val scores = new scala.collection.mutable.HashMap[String,Int] with scala.collection.mutable.SynchronizedMap[String,Int] |
10、scala源生通信框架(actor、akka)
11、單元測試框架:scalatest
12、var和val
13、基本數據類型https://www.tutorialspoint.com/scala/scala_data_types.htm
除java的8種類型外,還有:None、Unit、Null、Nothing、Any和AnyRef
相關說明---》https://www.jianshu.com/p/2a61366355a7
14、scala循環控制:breakable
http://www.cnblogs.com/TTyb/p/6703725.html
15、scala的classOf[T]、getClass和class有什麼區別以及什麼時候使用?
16、Scala的伴生對象是什麼?
17、Tuple的最大元素個數是多少?