一、单目运算符

运算符 对应的方法
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
a++ a.inc()
a– a.dec()

自增自减的过程

  • 当++、–放在变量前面时,执行过程如下:
  1. 先对变量调用inc()、dec()方法,并将方法返回值赋给变量。
  2. 自加或自减表达式返回变量的新值。
  • 当++、–放在变量后面时,执行过程如下 :
  1. 先用一个临时变量缓存变量的值。
  2. 对变量调用inc()、dec()方法,并将方法返回值赋给变量。
  3. 自加或自减表达式返回临时变量的值。

二、双目运算符

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 的执行顺序
  1. 如果plus()方法也存在, Kotlin将会报告错误(调用的目标方法不确定)。
  2. 确保plusAssign()没有返回值,否则报告错误。
  3. 如果能通过前两步的检查,则转换为执行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位),得到的结果才是真正移位的位数 。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐