1. 程式人生 > >scala複習(面試題)

scala複習(面試題)

1.Scala怎樣宣告變數與常量?

var val

2.Scala資料型別有哪些?

資料型別描述
Byte8位有符號補碼整數。數值區間為 -128 到 127
Short16位有符號補碼整數。數值區間為 -32768 到 32767
Int32位有符號補碼整數。數值區間為 -2147483648 到 2147483647
Long64位有符號補碼整數。數值區間為 -9223372036854775808 到 9223372036854775807
Float32位IEEE754單精度浮點數
Double64位IEEE754單精度浮點數
Char16位無符號Unicode字元, 區間值為 U+0000 到 U+FFFF
String字元序列
Booleantrue或false
Unit表示無值,和其他語言中void等同。用作不返回任何結果的方法的結果型別。Unit只有一個例項值,寫成()。
Nullnull 或空引用
NothingNothing型別在Scala的類層級的最低端;它是任何其他型別的子型別。
AnyAny是所有其他類的超類
AnyRefAnyRef類是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

【來自@若澤大資料】