scala複習(面試題)
1.Scala怎樣宣告變數與常量?
var val
2.Scala資料型別有哪些?
資料型別 | 描述 |
---|---|
Byte | 8位有符號補碼整數。數值區間為 -128 到 127 |
Short | 16位有符號補碼整數。數值區間為 -32768 到 32767 |
Int | 32位有符號補碼整數。數值區間為 -2147483648 到 2147483647 |
Long | 64位有符號補碼整數。數值區間為 -9223372036854775808 到 9223372036854775807 |
Float | 32位IEEE754單精度浮點數 |
Double | 64位IEEE754單精度浮點數 |
Char | 16位無符號Unicode字元, 區間值為 U+0000 到 U+FFFF |
String | 字元序列 |
Boolean | true或false |
Unit | 表示無值,和其他語言中void等同。用作不返回任何結果的方法的結果型別。Unit只有一個例項值,寫成()。 |
Null | null 或空引用 |
Nothing | Nothing型別在Scala的類層級的最低端;它是任何其他型別的子型別。 |
Any | Any是所有其他類的超類 |
AnyRef | AnyRef類是Scala裡所有引用類(reference class)的基類 |
上表中列出的資料型別都是物件,也就是說scala沒有java中的原生型別。在scala是可以對數字等基礎型別呼叫方法的。
3.String 物件是可變還是不可變?假如要建立一個可以修改的字串,應該使用哪個類?
在 Scala 中,字串的型別實際上是 Java String,它本身沒有 String 類。
在 Scala 中,String 是一個不可變的物件,所以該物件不可被修改。這就意味著你如果修改字串就會產生一個新的字串物件。但其他物件,如陣列就是可變的物件。
建立字串
建立字串例項如下:
var greeting ="Hello World!";或var greeting:String="Hello World!";
你不一定為字串指定 String 型別,因為 Scala 編譯器會自動推斷出字串的型別為 String。
可修改字串String Builder 類
String 物件是不可變的,如果你需要建立一個可以修改的字串,可以使用 String Builder 類,如下例項:
objectTest{def main(args:Array[String]){ val buf =newStringBuilder; buf +='a' buf ++="bcdef" println("buf is : "+ buf.toString );}}
String 方法
java.lang.String 中常用的方法
序號 | 方法及描述 |
---|---|
1 | char charAt(int index) 返回指定位置的字元 |
2 | int compareTo(Object o) 比較字串與物件 |
3 | int compareTo(String anotherString) 按字典順序比較兩個字串 |
4 | int compareToIgnoreCase(String str) 按字典順序比較兩個字串,不考慮大小寫 |
5 | String concat(String str) 將指定字串連線到此字串的結尾。 同樣你也可以使用加號(+)來連線。 |
6 | boolean contentEquals(StringBuffer sb) 將此字串與指定的 StringBuffer 比較。 |
7 | static String copyValueOf(char[] data) 返回指定陣列中表示該字元序列的 String |
8 | static String copyValueOf(char[] data, int offset, int count) 返回指定陣列中表示該字元序列的 String |
9 | boolean endsWith(String suffix) 測試此字串是否以指定的字尾結束 |
10 | boolean equals(Object anObject) 將此字串與指定的物件比較 |
11 | boolean equalsIgnoreCase(String anotherString) 將此 String 與另一個 String 比較,不考慮大小寫 |
12 | byte getBytes() 使用平臺的預設字符集將此 String 編碼為 byte 序列,並將結果儲存到一個新的 byte 陣列中 |
13 | byte[] getBytes(String charsetName 使用指定的字符集將此 String 編碼為 byte 序列,並將結果儲存到一個新的 byte 陣列中 |
14 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 將字元從此字串複製到目標字元陣列 |
15 | int hashCode() 返回此字串的雜湊碼 |
16 | int indexOf(int ch) 返回指定字元在此字串中第一次出現處的索引 |
17 | int indexOf(int ch, int fromIndex) 返返回在此字串中第一次出現指定字元處的索引,從指定的索引開始搜尋 |
18 | int indexOf(String str) 返回指定子字串在此字串中第一次出現處的索引 |
19 | int indexOf(String str, int fromIndex) 返回指定子字串在此字串中第一次出現處的索引,從指定的索引開始 |
20 | String intern() 返回字串物件的規範化表示形式 |
21 | int lastIndexOf(int ch) 返回指定字元在此字串中最後一次出現處的索引 |
22 | int lastIndexOf(int ch, int fromIndex) 返回指定字元在此字串中最後一次出現處的索引,從指定的索引處開始進行反向搜尋 |
23 | int lastIndexOf(String str) 返回指定子字串在此字串中最右邊出現處的索引 |
24 | int lastIndexOf(String str, int fromIndex) 返回指定子字串在此字串中最後一次出現處的索引,從指定的索引開始反向搜尋 |
25 | int length() 返回此字串的長度 |
26 | boolean matches(String regex) 告知此字串是否匹配給定的正則表示式 |
27 | boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 測試兩個字串區域是否相等 |
28 | boolean regionMatches(int toffset, String other, int ooffset, int len) 測試兩個字串區域是否相等 |
29 | String replace(char oldChar, char newChar) 返回一個新的字串,它是通過用 newChar 替換此字串中出現的所有 oldChar 得到的 |
30 | String replaceAll(String regex, String replacement 使用給定的 replacement 替換此字串所有匹配給定的正則表示式的子字串 |
31 | String replaceFirst(String regex, String replacement) 使用給定的 replacement 替換此字串匹配給定的正則表示式的第一個子字串 |
32 | String[] split(String regex) 根據給定正則表示式的匹配拆分此字串 |
33 | String[] split(String regex, int limit) 根據匹配給定的正則表示式來拆分此字串 |
34 | boolean startsWith(String prefix) 測試此字串是否以指定的字首開始 |
35 | boolean startsWith(String prefix, int toffset) 測試此字串從指定索引開始的子字串是否以指定字首開始。 |
36 | CharSequence subSequence(int beginIndex, int endIndex) 返回一個新的字元序列,它是此序列的一個子序列 |
37 | String substring(int beginIndex) 返回一個新的字串,它是此字串的一個子字串 |
38 | String substring(int beginIndex, int endIndex) 返回一個新字串,它是此字串的一個子字串 |
39 | char[] toCharArray() 將此字串轉換為一個新的字元陣列 |
40 | String toLowerCase() 使用預設語言環境的規則將此 String 中的所有字元都轉換為小寫 |
41 | String toLowerCase(Locale locale) 使用給定 Locale 的規則將此 String 中的所有字元都轉換為小寫 |
42 | String toString() 返回此物件本身(它已經是一個字串!) |
43 | String toUpperCase() 使用預設語言環境的規則將此 String 中的所有字元都轉換為大寫 |
44 | String toUpperCase(Locale locale) 使用給定 Locale 的規則將此 String 中的所有字元都轉換為大寫 |
45 | String trim() 刪除指定字串的首尾空白符 |
46 | static String valueOf(primitive data type x) 返回指定型別引數的字串表示形式 |
(注:引用自http://blog.csdn.net/pipisorry/article/details/52902348)
4.轉義字元用什麼符號?
Scala 轉義字元
下表列出了常見的轉義字元:
轉義字元 | Unicode | 描述 |
---|---|---|
\b | \u0008 | 退格(BS) ,將當前位置移到前一列 |
\t | \u0009 | 水平製表(HT) (跳到下一個TAB位置) |
\n | \u000a | 換行(LF) ,將當前位置移到下一行開頭 |
\f | \u000c | 換頁(FF),將當前位置移到下頁開頭 |
\r | \u000d | 回車(CR) ,將當前位置移到本行開頭 |
\" | \u0022 | 代表一個雙引號(")字元 |
\' | \u0027 | 代表一個單引號(')字元 |
\\ | \u005c | 代表一個反斜線字元 '\' |
0 到 255 間的 Unicode 字元可以用一個八進位制轉義序列來表示,即反斜線‟\‟後跟 最多三個八進位制。
在字元或字串中,反斜線和後面的字元序列不能構成一個合法的轉義序列將會導致 編譯錯誤。
以下例項演示了一些轉義字元的使用:
objectTest{def main(args:Array[String]){ println("Hello\tWorld\n\n");}}
$ scalac Test.scala $ scala TestHelloWorld
(注:引用自菜鳥教程)
5.IF...ELSE 語法是什麼?
if(布林表示式){
// 如果布林表示式為 true 則執行該語句塊
}else{
// 如果布林表示式為 false 則執行該語句塊
}
6.迴圈語句哪三種,分別語法是什麼?怎樣退出迴圈?
while(condition)
{
statement(s);
}
在這裡,statement(s) 可以是一個單獨的語句,也可以是幾個語句組成的程式碼塊。
condition 可以是任意的表示式,當為任意非零值時都為 true。當條件為 true 時執行迴圈。 當條件為 false 時,退出迴圈,程式流將繼續執行緊接著迴圈的下一條語句。
do {
statement(s);
} while( condition );
for( var x <- Range ){
statement(s);
}
以上語法中,Range 可以是一個數字區間表示 i to j ,或者 i until j。左箭頭 <- 用於為變數 x 賦值。
for( var x <- List ){
statement(s);
}
以上語法中, List 變數是一個集合,for 迴圈會迭代所有集合的元素。
for( var x <- List
if condition1; if condition2...
){
statement(s);
}
以上是在 for 迴圈中使用過濾器的語法。
var retVal = for{ var x <- List
if condition1; if condition2...
}yield x
你可以將 for 迴圈的返回值作為一個變數儲存。
大括號中用於儲存變數和條件,retVal 是變數, 迴圈中的 yield 會把當前的元素記下來,儲存在集合中,迴圈結束後將返回該集合。
當在迴圈中使用 break 語句,在執行到該語句時,就會中斷迴圈並執行迴圈體之後的程式碼塊。
// 匯入以下包
import scala.util.control._
// 建立 Breaks 物件
val loop = new Breaks;
// 在 breakable 中迴圈
loop.breakable{
// 迴圈
for(...){
....
// 迴圈中斷
loop.break;
}
}
7.函式中 Unit是什麼意思?
Scala中的Unit型別類似於java中的void,無返回值。主要的不同是在Scala中可以有一個Unit型別值,也就是(),然而java中是沒有void型別的值的。除了這一點,Unit和void是等效的。一般來說每一個返回void的java方法對應一個返回Unit的Scala方法。
8.Scala怎樣定義一個不帶入參,不返回值的函式
def functionName = {
function body
return [expr]
}
9.Scala怎樣定義一個帶入參,返回值的函式
def functionName ([引數列表]) : [return type] = {
function body
return [expr]
}
10.什麼是閉包?(******************)
閉包是一個函式,返回值依賴於宣告在函式外部的一個或多個變數。
var factor = 3
val multiplier = (i:Int) => i * factor
閉包的實質就是程式碼與用到的非區域性變數的混合,即:
閉包 = 程式碼 + 用到的非區域性變數
11.val a = 10,怎樣將a轉為double型別、String型別?
a.toString
a.toDouble
12.Scala函式中是把方法體的最後一行作為返回值,需不需要顯示呼叫return?
不需要
13.怎樣定義一個字串陣列?下標是從1開始的嗎?
從0開始val numArr = new Array[Int](10)
從0開始val a=Array("a","b")
14.1 to 10 ==> 1.to(10),10包含不包含?
包含
15.Range(1, 10),10包含不包含?for( a <- 1 until 10){ println( "Value of a: " + a ); },10包含不包含?
都不包含
16.Scala 模式匹配語法是什麼?
def matchTest(x: Int): String = x match {
case 1 => "one"
}
17.異常報錯的語法?
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
object Test {
def main(args: Array[String]) {
try {
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException => {
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
} finally {
println("Exiting finally...")
}
}
}
18.Array、ArrayBuffer,誰是定長?誰是變長?
Array是定長、ArrayBuffer是變長
19.什麼是隱式轉換函式?什麼場景下用?怎樣定義?
我們經常引入第三方庫,但當我們想要擴充套件新功能的時候通常是很不方便的,因為我們不能直接修改其程式碼。scala提供了隱式轉換機制和隱式引數幫我們解決諸如這樣的問題。
implicit def file2Array(file: File): Array[String] = file.lines
20.Scala面向物件,三大特性是什麼?什麼區別?
繼承:父和子的關係
封裝:屬性、方法
多型:父類引用指向子類物件
21.Scala 基本語法需要注意點?
1.類名 - 對於所有的類名的第一個字母要大寫嗎?
是的 class MyFirstScalaClass
2.方法名稱 - 所有的方法名稱的第一個字母用小寫嗎?
是的 def myMethodName()
22.物件是什麼?類是什麼?怎樣在IDEA建立檔案?
類是物件的抽象,而物件是類的具體例項。類是抽象的,不佔用記憶體,而物件是具體的,佔用儲存空間。類是用於建立物件的藍圖,它是一個定義包括在特定型別的物件中的方法和變數的軟體模板。
new->scala class
23.變長陣列ArrayBuffer的系列問題
import scala.collection.mutable.ArrayBuffer
var c = new ArrayBuffer[Int]();
1. 在尾部新增一個元素
c += 2
2. 在尾部新增多個元素
c += (3,4,5)
3. 追加集合
c ++= Array(6,7,8,9)
4. 指定位置新增元素
c.insert(3, 33) //在下標3之前插入元素
5. 移除尾部n個元素
c.trimEnd(n)
6. 移除開頭n個元素
c.trimStart(n)
7. 移除某個位置的元素
c.remove(3)
8. 移除從下標為n開始(包括n)的count個元素
c.remove(n, count)
9. ArrayBuffer 轉 Array
c.toArray
10. Array 轉 ArrayBuffer
c.toBuffer
【來自@若澤大資料】