事实上,我是新来的Kotlin;因此,这个问题可能是很基本的。
根据Kotlin文档,可以使用===
和==
操作符比较两个变量。第一个(“==”)检查它们是否具有相同的内容,第二个(“+==”)检查它们是否具有相同的引用。但是,我找不到任何对象具有相同内容但具有不同引用的内置类。
var str1 : String = "Hello World"
var str2 : String = "Hello World"
if( str1 == str2 ){ // yes
print("Their contents are same\n")
{
if( str1 === str2 ){ // yes
print("Their references are same\n")
}
到目前为止我遇到的所有类的示例如果它们的内容相同,那么它们的引用也相同。我们如何定义两个内容相同但引用不同的对象呢?
3条答案
按热度按时间tf7tbtn21#
引用相等
引用相等性由
===
操作(及其求反的对应项!==
)检查。当且仅当a和b指向同一对象时,a === b
才计算为true。换句话说,
===
运算符比较a
和b
是否是相同的引用。在一些基本类型上使用它可能会引起误解,原因如下:例如:
显然,在这两种情况下,
a == b
和c == d
都为真。Since string interning is also possible at compile time
===
在简单场景中也返回true
:结构相等
使用
==
运算符(及其求反的对应项!=
)检查结构是否相等。按照约定,类似a == b
的表达式将转换为:a?.equals(b) ?: (b === null)
正如我们在上面看到的,对于
String
和Int
这样的内置类来说,即使它们的内容是相等的,也会因为引用相等===
而返回false,这是非常正常的。Kotlin允许我们定义这样的类,它们可以很容易地检查与data classes
的结构相等性,如下所示:2eafrhcq2#
像这样比较
String
引用将返回true
,因为JVM通过重用第一个String
示例来优化示例代码,因为它无论如何都是不可变的。然而,如果直接调用类的构造函数,则会跳过任何优化,并获得不同的示例:
旁注:在Java中,我会用
new String("Hello world")
来展示这个例子,但显然KotlinString
类没有这种形式的构造函数。ie3xauqp3#
由于您定义字符串的方式,===不起作用。如果您使用文本创建字符串,它将指向字符串池中的同一个字符串。