這一章的一些基礎性的東西,主要包括Scala中的基本變量類型,以及相關的一些操作符。
一、簡單類型
下表中列出Scala語言中的基本類型,以及其字節長度,其中Byte, Short, Int, Long以及Char都屬於整型,整型再加上Float和Doble統稱爲數字類型。
類型 | 描述 |
---|---|
Byte | 8位有符號補碼整型(-2^7~2^7 - 1) |
Short | 16位有符號補碼整型(-2^15~2^15 - 1) |
Int | 32位有符號補碼 整型(-2^31~2^31 - 1) |
Long | 64位有符號補碼 整型(-2^63~2^63 - 1) |
Char | 16位無符號Unicode字符(0~2^16 - 1) |
String | 由一系列Char組成 |
Floar | 32位雙精度浮點型 |
Double | 64位雙精度浮點型 |
Boolean | true或false |
二、操作和方法
Scala中的+, -, *, /
實質上都是方法的調用,前面提到過1 + 2
實際上是(1).+(2)
的簡單形式,在這裏Int型變量有一個名稱爲+
的方法,這個方法接收一個Int型參數,返回值也爲Int類型。Int型變量的+
方法也可以接收一個Long型變量,返回結果爲Long型。這裏可以理解成有多個重載的+
方法。
val sum = 1 + 2
val sumMore = (1).+(2)
val longSum = 1 + 2L
運算結果如下:
對於String類型的變量,可以直接調用其indexOf
方法返回指定字符在字符串中出現第一次的下標位置。
同樣的String也提供了另外一個重載的indexOf
方法,這個方法可以接收兩個參數,返回從指定位開始第一個指定字符的下標
s indexOf('o', 5)
從這裏可以看出,不管是+
操作,還是indexOf
操作,在Scala中本質是相同的,同樣都是對某個對象的方法調用。
三、對象的equal判斷
對Java熟悉的同學應該比較清楚==
和equals
的區別。在Scala中判斷兩個對象是否相等可以直接使用==
方法。
1、字面量之間
首先看一下對字面量使用==
方法的結果,和Java中是一樣的
2、對象之間
再看一下兩個對象之間直接使用==
方法的結果,
3、不同類型對象之間
==
方法也可用於不同類型的對象之間,並且可以與null
進行比較
從上面這些操作可以看到,除了字面量的比較之外,Scala中==
和Java中是不相同的。Java中,引用類型的==
判斷僅僅比較兩個引用值是否指向內存堆中的同一個對象。而在Scala中對兩個引用的==
比較,和Java中的equals
方法效果是相同的。同時,在Scala中提供了一個eq
方法用於判斷兩個引用值是否指向同一個對象。ne
與eq
的功能相反。
Scala中調用==
方法,程序執行時,首先判斷左邊的變量是否爲null,如果不爲null則調用其equals
方法,判斷右邊變量是否相等。
四、富封裝
Scala通過富封裝爲基本類型變量提供了更多的操作符,比如說對Int類型,有一個對應的富封裝類爲RichInt類型。基本變量的更多操作,以及基本變量的富封裝類對應關係分別列舉在下面的兩個表格中。
富封裝提供的操作表:
操作 | 結果 |
---|---|
0 max 5 | 5 |
0 min 5 | 0 |
-2.7 abs | 2.7 |
-2.7 round | -3L |
1.5 isInfinity | false |
(1.0 / 0) isInfinity | true |
4 to 6 | 4, 5, 6 |
“bob” capitalize | “Bob” |
“robert” drop 2 | “bert” |
富封裝類對應關係表:
基本類型 | 富封裝類型 |
---|---|
Byte | scala.runtime.RichByte |
Short | scala.runtime.RichShort |
Int | scala.runtime.RichInt |
Char | scala.runtime.RichChar |
Float | scala.runtime.RichFloat |
Double | scala.runtime.RichDouble |
Boolean | scala.runtime.RichBoolean |
String | scala.collection.immutable.StringOps |