kotlin 中的? :: !! 符号

kotlin中的各种符号学习

  • ?加在变量之后,系统任何情况都不会抱他的空指针异常。意思就是允许该变量值为null。
  • !! 加在变量之后,如果对象为空,则会报异常。等同于java。
  • ?: A ?: B 如果A 的值为空,则会返回B。
  • :: 表示把一个方法当做一个参数,传递到另一个方法中进行使用。即引用一个方法。 详情参考: https://blog.csdn.net/lv_fq/article/details/72869124
  • ->
  • ==比较值大小,===比较对象地址。装箱之后,数值相等,但是地址可能已经不同了。不一定保留同一性。注意是可能。含特殊情况。
示列1   
fun main(args: Array) {
	val a : Int = 1000
	println(a == a) //true 单纯比较数值大小
	println(a === a) //true //同一对象
	val a1 : Int = a 
	val a2 : Int = a 
	println(a1 == a2) //true 数值大小
	println(a1 === a2) //true  同一对象和数值比较
}
示列2
fun main(args: Array) {
	val a : Int = 1000
	println(a == a) //true
	println(a === a) //true
	val a1 : Int? = a
	val a2 : Int? = a
	println(a1 == a2) //true
	println(a1 === a2) //false 之所以为false,因为经过了装箱
}
示列3
fun main(args: Array) {
	val a : Int? = 1000
	println(a == a) //true
	println(a === a) //true
	val a1 : Int? = a    //a经过装箱之后本身已经是一个对象此时a是一个对象
	val a2 : Int? = a
	println(a1 == a2) //true
	println(a1 === a2) //true  此时a1 a2 同时指向了同一个对象a
}
示列4
fun main(args: Array) {
	val a : Int = 100  //和上面不一样,a的值发生了变化
	println(a == a) //true
	println(a === a) //true
	val a1 : Int? = a
	val a2 : Int? = a
	println(a1 == a2) //true
	println(a1 === a2) //true  之所以不变是因为和java一样,[-128,127]之间的数装箱并不会产生创建新的对象。
}

补充说明下:(引用下官方文档话术)
kotlin中的所有东西都是对象。数字在java平台是物理存储为jvm的原生类型,但是除非我们需要一个可空的引用,打个比方 Int? 或者泛型。这样的情况下会把数字进行装箱。
数字装箱不一定保留同一性, 就是因为 -128到127 之间, 是从IntegerCache.cache中拿取的,而不是该范围则是每次创建一个Integer对象。kotlin中关于新建Integer对象源码如下:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

你可能感兴趣的:(Kotlin,kotlin中的符号,?)