为什么kotlin使用===比较基元类型,如果它们具有相同的值,则它们彼此相等
为什么打印为真 我猜kotlin有一个基本类型池(或者类似的东西)。 如果值相等,指针指向相同的位置。我不确定 Kotlin只是重复使用相同的机制。有关更多说明,请参见和。 在Kotlin中,有两种类型的平等:为什么kotlin使用===比较基元类型,如果它们具有相同的值,则它们彼此相等,kotlin,Kotlin,为什么打印为真 我猜kotlin有一个基本类型池(或者类似的东西)。 如果值相等,指针指向相同的位置。我不确定 Kotlin只是重复使用相同的机制。有关更多说明,请参见和。 在Kotlin中,有两种类型的平等: 引用相等(两个引用指向同一对象) 结构相等(检查等于() 引用相等性由==操作检查(及其否定的对应项!=)a===b当且仅当 a和b指向同一对象 结构相等性由=操作检查(及其否定的对应项!=)。按照惯例,类似于a==b 翻译成:你看 因此您可以看到:=表示等于,==表示引用相等 这
- 引用相等(两个引用指向同一对象)李>
- 结构相等(检查等于()
==
操作检查(及其否定的对应项!=
)a===b
当且仅当
a和b指向同一对象
结构相等性由=
操作检查(及其否定的对应项!=
)。按照惯例,类似于a==b
翻译成:你看
因此您可以看到:=
表示等于,==
表示引用相等
这意味着
a?.equals(b) ?: (b === null)
比较引用,这将导致错误
。
但是:当您使用像“hello”
这样的字符串文字时,将使用java的字符串缓存(这是一种节省内存的优化)。因此,两次都得到相同的引用,因此引用等式为真。Kotlin中的等式
我在中解释了Kotlin中使用的通用平等工具。
TLDR:
结构相等:==
编译为Java的相等
引用相等:==
是==
在Java中所做的:引用彼此比较。如果对相同的对象进行比较,则会产生true
您的示例中的字符串怎么样?
字符串的特殊之处在于它们与所谓的字符串常量池一起工作。例如,即使在Java中,以下两种比较都是true
:
val hello1 = "hello"
val hello2 = "hello"
printf(hello1 === hello2)
另一方面,由于正在创建new
字符串,因此下一个代码段的工作方式有所不同:
public static void main(String[] args) {
String s = "prasad";
String s2 = "prasad";
System.out.println(s.equals(s2));
System.out.println(s == s2);
}
请在此处阅读:
仅供参考:String
s不是基元。请注意,String
不是基元类型。即使如此,我还是认为只有基元类型,因为==
比较引用,就像在Java中一样,有一个字符串池-字符串文本在池中共享,因此,如果有两个具有相同内容的字符串文本,那么只有一个string
对象,并且两个变量都指向同一个对象。我的意思是val a1=1 val a2=1 print(a1==a2)为真,为什么?有一个整数池?没有。在该示例中,a1
和a2
不是Integer
对象,它们只是基本值,而不是对象<代码>=
只是比较这些值。与Java中的==
完全相同。不,这个特殊功能专用于String
,即使如此,为什么其他原语类型run===也会变为true对于原语,正如您所说,但String不是原语,String是使其特殊的对象(池)Kotlin没有原语类型?我只看到Int,Boolean,Double。。。仅仅因为它看起来像一个类并不意味着它必须用字节码表示为一个类?我只看到Int,Boolean,Double。。。Kotlin确实有原语,但编译器决定何时使用它以及何时使用包装器类型。所以Int
,Boolean
。。。在大多数情况下,将编译为字节码中的基元类型(当它们不涉及泛型或使用类型的可空变量Int?
)
public static void main(String[] args) {
String s = "prasad";
String s2 = "prasad";
System.out.println(s.equals(s2));
System.out.println(s == s2);
}
String foo = new String("hello");
String bar = new String("hello");
System.out.println(foo == bar); // prints 'false'