为什么kotlin使用===比较原始类型,如果它们具有相同的值,则彼此相等

时间:2017-10-24 06:30:07

标签: kotlin

val hello1 = "hello"
val hello2 = "hello"
printf(hello1 === hello2)

为什么打印真实?

我猜kotlin有一个原始类型池(或类似的东西)。 如果值是相等的,则指针指向同一个地方。我不确定。

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

Kotlin中的平等

我在this answer中解释了Kotlin中使用的一般平等工具。 TLDR:

  1. 结构平等:==编译为Java的equals

  2. 引用相等:=====在Java中的作用:引用相互比较。如果正在比较相同的对象,则会产生true

  3. 你的例子中的字符串怎么样?

    字符串的特殊之处在于它们可以使用所谓的字符串常量池。例如,即使在Java中,以下两个比较都是true

    public static void main(String[] args) {
        String s = "prasad";
        String s2 = "prasad";
    
        System.out.println(s.equals(s2));
        System.out.println(s == s2);
    }
    

    另一方面,自创建new字符串以来,下一个代码段的工作方式不同:

    String foo = new String("hello");
    String bar = new String("hello");
    System.out.println(foo == bar);  // prints 'false'
    

    在此处阅读:What is the Java string pool and how is "s" different from new String("s")?

    仅供参考:String s不是原始的。

答案 2 :(得分:1)

https://kotlinlang.org/docs/reference/equality.html

  

在Kotlin中有两种类型的平等:

     
      
  • 参照等式(两个引用指向同一个对象);
  •   
  • 结构相等(检查等于())。
  •   
     

参照等式===操作(及其否定的对应!==)检查。当且仅当a === b评估为真   a和b指向同一个对象

     

结构相等性==操作(及其否定的对应!=)检查。按照惯例,像a == b这样的表达式   翻译为:所以你看

a?.equals(b) ?: (b === null)

所以你看到:==表示equals===表示参照平等

这意味着

val hello1 = "hello"
val hello2 = "hello"
printf(hello1 === hello2)

是参考比较,应该导致false。 但是:当您使用像"hello"这样的字符串文字时,会使用java的字符串缓存(这是一种节省内存的优化)。所以你得到两次相同的引用,因此引用相等是真的。