scala最近幾年很火,主要是因為其在大資料領域的應用。
下面這些面試題,基本上是scala函式式程式設計的精髓。
q1 var,val和def三個關鍵字之間的區別?
**示例:
var x = 3 // x是int型別
x = 4 //
x = "error" // 型別變化,編譯器報錯'error: type mismatch'
val y = 3
y = 4 //常量值不可更改,報錯 'error: reassignment to val'
def fun(name: string) = "hey! my name is: " + name
fun("scala") // "hey! my name is: scala"
//注意scala中函式式程式設計一切都是表示式
lazy val x =
val y =
x+x //
y+y // x 沒有計算, 列印結果"computing y"
**示例
//宣告乙個類
class myclass(number: int, text: string)
//宣告乙個物件
object myobject
new myclass(3,"text").classmethod() //列印結果test,需要例項化類
myclass.classmethod() //無法直接呼叫類的方法
myobject.objectmethod() //列印結果object,物件可以直接呼叫方法
**示例
//宣告乙個樣本類
case class mycaseclass(number: int, text: string, others: list[int])
//不需要new關鍵字,建立乙個物件
val dto = mycaseclass(3, "text", list.empty) //列印結果3
//利用樣本類預設實現的copy方法
dto.copy(number = 5) //列印結果5
val dto2 = mycaseclass(3, "text", list.empty)
pringln(dto == dto2) // 返回true,兩個不同的引用物件
class myclass(number: int, text: string, others: list[int]) {}
val c1 = new myclass(1, "txt", list.empty)
val c2 = new myclass(1, "txt", list.empty)
println(c1 == c2 )// 返回false,兩個不同的引用物件
**示例:
//定義乙個類
class myclass(number: int, text: string)
//定義乙個伴生物件
object myclass
myclass.objectsecret // 無法訪問
myclass.classsecret // 無法訪問
new myclass(-1, "random").objectsecret // 無法訪問
new myclass(-1, "random").classsecret // 無法訪問
示例**
//宣告第乙個函式
def func(): int =
//宣告第二個函式,scala預設的求值就是call-by-value
def callbyvalue(x: int) =
//宣告第三個函式,用=>表示call-by-name求值
def callbyname(x: => int) =
//開始呼叫
//call-by-value求值
callbyvalue(func())
//輸出結果
//computing stuff....
//1st x: 42
//2nd x: 42
//call-by-name求值
callbyname(func())
//輸出結果
//computing stuff....
//1st x: 42
//computing stuff....
//2nd x: 42
**示例:
val person: person = getpersonbyidondatabaseunsafe(id = 4) // 如果沒有id=4的person時,返回null物件
println(s"this person age is $") //如果是null,丟擲異常
val personopt: option[person] = getpersonbyidondatabasesafe(id = 4) // 如果沒有id=4的person時,返回none型別
personopt match ")
case none => println("there is no person with that id")
}
**示例:
// <-表示迴圈遍歷
scala> for (i <- 1 to 5) yield i * 2
res0: scala.collection.immutable.indexedseq[int] = vector(2, 4, 6, 8, 10)
示例**:
// 三層迴圈巢狀
for yield
//上面的可轉換為
c1.flatmap(x => c2.flatmap(y => c3.withfilter(z => z > 0).map(z => )))
**示例:**示例:
//返回乙個either型別//返回乙個e
def personage(id: int): either[string, int] =
**示例:
def add(a: int)(b: int) = a + b
val add2 = add(2)(_) //_ 表示不只乙個的意思
scala> add2(3)res0: int = 5
正常遞迴,每一次遞迴步驟,需要儲存資訊到堆疊裡面,當遞迴步驟很多時,導致堆疊溢位。尾遞迴就是為了解決上述問題,在尾遞迴中所有的計算都是在遞迴之前呼叫,
編譯器可以利用這個屬性避免堆疊錯誤,尾遞迴的呼叫可以使資訊不插入堆疊,從而優化尾遞迴。
使用 @tailrec 標籤可使編譯器強制使用尾遞迴。
**示例:
def sum(n: int): int = else
}@tailrec //告訴編譯器
def tailsum(n: int, acc: int = 0): int = else
}sum(5)
5 + sum(4) // 暫停計算 => 需要新增資訊到堆疊
5 + (4 + sum(3))
5 + (4 + (3 + sum(2)))
5 + (4 + (3 + (2 + sum(1))))
5 + (4 + (3 + (2 + 1)))
15tailsum(5) // tailsum(5, 0) 預設值是0
tailsum(4, 5) // 不需要暫停計算
tailsum(3, 9)
tailsum(2, 12)
tailsum(1, 14)
tailsum(0, 15)
15
常見筆試題記錄
linux命令 1 tcpdump dump the traffic on a network,根據使用者的定義對網路上的資料報進行截獲的包分析工具。tcpdump 可以將網路中傳送的資料報的 頭 完全截獲下來提供分析。它支援針對網路層 協議 主機 網路或埠的過濾,並提供 and or not等邏輯...
c 常見筆試題(4)
40.鍊錶題 乙個鍊錶的結點結構 struct node typedef struct node node 1 已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序 intel node reverselist node head 鍊錶逆序 p2 next p1 head p2 return head...
鍊錶常見筆試題
鍊錶的一些常見筆試面試問題總結及 先什麼也不說,假設鍊錶節點的資料結構為 struct node 建立單鏈表的程式為 struct node create unsigned int n node p head for unsigned int i 1 i n i return head 問題1 鍊錶...