一、單目運算符
運算符 | 對應的方法 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
– | – |
a++ | a.inc() |
a– | a.dec() |
自增自減的過程
- 當++、–放在變量前面時,執行過程如下:
- 先對變量調用inc()、dec()方法,並將方法返回值賦給變量。
- 自加或自減表達式返回變量的新值。
- 當++、–放在變量後面時,執行過程如下 :
- 先用一個臨時變量緩存變量的值。
- 對變量調用inc()、dec()方法,並將方法返回值賦給變量。
- 自加或自減表達式返回臨時變量的值。
二、雙目運算符
1、算數運算符
運算符 | 對應的方法 |
---|---|
a+b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.rem(b) |
a…b | a.rangeTo(b) |
2、in 運算符
運算符 | 對應的方法 |
---|---|
a in b | b.contains(a) |
a !in b | !b.minus(a) |
in
是一個可以簡化的語法糖。
Kotlin中我們使用只要帶有contains的類,都可以用in
來代替。
var str1 = "zincPower"
println(str1.contains("Power"))
println("Power" in str1)
// 數組也是可以用來替換
val array = arrayOf(24, 45, 100, -3, 30)
println(array.contains(100))
println(100 in array)
3、索引訪問符
運算符 | 對應的方法 |
---|---|
a[i] | a.get(i) |
a[i,j] | a.get(i,j) |
a[i_1,…i_n] | a.get(i_1,…,i_n) |
a[i]=b | a.set(i, b) |
a[i,j]=b | a.set(i,j,b) |
a[i_1,…,i_n]=b | a.set(i_1,…,b) |
也是一個語法糖,在訪問字符串或列表時,可以用 str[index]
或 list[index]
,得益於此處的方法。
4、調用符
運算符 | 對應的方法 |
---|---|
a() | a.invoke() |
a(b) | a.invoke(b) |
a(b1,b2) | a.invoke(b1,b2) |
a(b1,b2,b3,…) | a.invoke(b1,b2,b3,…) |
5、廣義賦值符
運算符 | 對應的方法 |
---|---|
a+=b | a.plusAssign(b) |
a-=b | a.minusAssign(b) |
a*=b | a.timesAssign(b) |
a/=b | a.divAssign(b) |
a%=b | a.remAssign(b) |
plusAssign 的執行順序
- 如果
plus()
方法也存在, Kotlin將會報告錯誤(調用的目標方法不確定)。 - 確保
plusAssign()
沒有返回值,否則報告錯誤。 - 如果能通過前兩步的檢查,則轉換爲執行a.plusAssign(b)。如果plusAssign()方法不存在,那麼 a+=b 將轉換爲 a=a+b 代碼。
Kotlin 的賦值運算不是表達式,因此不需要返回值 。
這裏因爲沒有plusAssign
則進行調用了plus
var m1 = MyTest("jp")
var m2 = MyTest("xp")
m1 += m2
println(m1.name)
class MyTest(val name: String) {
operator fun plus(myTest: MyTest): MyTest {
println("plus")
return MyTest("zi")
}
}
這裏調用了plusAssign
值得注意沒有返回值
var m1 = MyTest("jp")
var m2 = MyTest("xp")
m1 += m2
class MyTest(val name: String) {
operator fun plusAssign(myTest: MyTest) {
println("plusAssign")
}
}
6、==、!=符
運算符 | 對應的方法 |
---|---|
a==b | a?.equals(b) ?: (b === null) |
a!=b | !(a?.equals(b) ?: (b=== null))) |
kotlin中==
和java中的equals
相等。
java中==
和!=
等價於kotlin中的===
和!==
7、比較運算符
運算符 | 對應的方法 |
---|---|
a>b | a.compareTo(b) > 0 |
a<b | a.compareTo(b) < 0 |
a>=b | a.compareTo(b) >= 0 |
a<=b | a.compareTo(b) <= 0 |
值得注意的是,java中Comparable接口中有compareTo方法,所以實現了Comparable接口的類都可以用這個。
三、位運算符
支持的七個爲運算符
- and:與
- or:或
- inv:非
- xor:異或
- shl:左移運算符
- shr:右移運算符
- ushr:無符號右移運算符
shl
左移指定位數後,補0。
shr、ushr
對於shr運算符而言,把第一個操作數的二進制碼右移指定位數後,左邊空出來的位以原來的符號位填充,即如果第一個操作數原來是正數,則左邊補0;如果第一個操作數是負數,則左邊補1。
ushr是無符號右移運算符,它把第一個操作數的二進制碼右移指定位數後,左邊空出來的位總是 以0 充。
左右移規則
- 對於 Int類型的整數移位a shr b,當 b>32 時,系統先用b對32求餘(因爲Int類型只有32位),得到的結果纔是真正移位的位數。
例如, a shr 33和a shr 1的結果完全一樣,而a shr 32的結果和a相同。 - 對於Long類型的整數移位a shr b,當 b>64時,總是先用b對64求餘(因爲Long類型是64位),得到的結果纔是真正移位的位數 。