Kotlin中‘==’与‘===’的区别是什么?示例解析需求
嘿,我来给你把Kotlin里==和===的区别讲明白,你举的例子之所以两个判断都返回true,是因为字符串常量池的小机制在起作用,咱们一步步拆解:
Kotlin中
==与===的核心差异 ==:值相等判断
这玩意儿本质上是调用对象的equals()方法(针对非空对象),核心是比较两个对象的内容/值是否一致。Kotlin里所有类都默认继承自Any类,Any的equals()默认是判断引用相等,但像String、Int这类标准库类都重写了equals(),所以对字符串来说,==就是在检查两个字符串的字符序列是不是完全一模一样。===:引用相等判断
这个是直接比较两个对象的内存地址,说白了就是判断两个变量是不是指向堆内存里的同一个对象实例。只有当两个变量指向同一个对象时,===才会返回true。
为什么你的例子里===也返回true?
你写的这段代码:
val str1 = "Hello, World!" val str2 = "Hello," + " World!" println(str1 == str2)//print true println(str1 === str2)//also print true
这是因为Java/Kotlin的字符串常量池机制:在编译阶段,编译器会把字符串常量的拼接操作优化成完整的常量字符串,所以"Hello," + " World!"编译后其实就是"Hello, World!"。这个字符串会被放进JVM的字符串常量池里,当你创建str1和str2时,它们都会直接指向常量池里的同一个字符串对象,所以引用是相等的,===自然就返回true了。
换个场景就能看出差异
要是换成运行时动态生成字符串的情况,结果就不一样了:
val str1 = "Hello, World!" val str2 = StringBuilder("Hello,").append(" World!").toString() println(str1 == str2) // 依然返回true,因为两个字符串的内容完全一致 println(str1 === str2) // 这里会返回false,因为str2是运行时生成的新字符串对象,不在常量池里,和str1不是同一个实例
一句话总结
- 想判断两个对象内容是否相同,用
== - 想判断两个变量是否指向同一个对象实例,用
===
内容的提问来源于stack exchange,提问作者Jatin Bansal
相关产品推荐
相关产品推荐

