一、单目运算符
运算符 | 对应的方法 |
---|---|
+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位),得到的结果才是真正移位的位数 。