欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kotlin 中的? :: !! 符号

程序员文章站 2024-03-20 22:19:22
...

kotlin中的各种符号学习

  • ?加在变量之后,系统任何情况都不会抱他的空指针异常。意思就是允许该变量值为null。
  • !! 加在变量之后,如果对象为空,则会报异常。等同于java。
  • ?: A ?: B 如果A 的值为空,则会返回B。
  • :: 表示把一个方法当做一个参数,传递到另一个方法中进行使用。即引用一个方法。 详情参考: https://blog.csdn.net/lv_fq/article/details/72869124
  • ->
  • ==比较值大小,===比较对象地址。装箱之后,数值相等,但是地址可能已经不同了。不一定保留同一性。注意是可能。含特殊情况。
示列1   
fun main(args: Array<String>) {
	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<String>) {
	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<String>) {
	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<String>) {
	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);
}