Kotlin 中的引用相等

qua*_*ien 5 kotlin

我正在学习 Kotlin,在教程示例中:

fun main() {
    val a: Int = 100
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a

    val b: Int = 1000
    val boxedB: Int? = b
    val anotherBoxedB: Int? = b

    println(boxedA === anotherBoxedA) // true
    println(boxedB === anotherBoxedB) // false
}
Run Code Online (Sandbox Code Playgroud)

为什么两次比较的结果不同?

Yur*_*mke 6

很可能是因为 Integer.valueOf 的 JDK 实现

https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int)

返回表示指定 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用此方法而不是构造函数 Integer(int),因为此方法通过缓存频繁请求的值可能会产生明显更好的空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。

如果在 Intellij 中反编译该方法,您会发现

   public static final void main() {
      int a = 100;
      Integer boxedA = Integer.valueOf(a);
      Integer anotherBoxedA = Integer.valueOf(a);
      int b = 1000;
      Integer boxedB = Integer.valueOf(b);
      Integer anotherBoxedB = Integer.valueOf(b);
      boolean var6 = boxedA == anotherBoxedA;
      boolean var7 = false;
      System.out.println(var6);
      var6 = boxedB == anotherBoxedB;
      var7 = false;
      System.out.println(var6);
   }
Run Code Online (Sandbox Code Playgroud)