Kotlin与Java中Object equals对比:同内容对象为何结果不同?
为什么Kotlin和Java中User对象equals结果不同?
嘿,这个问题问得特别到位!刚好戳中了Kotlin和Java在类设计上的一个核心差异,我来给你掰扯清楚:
先看Java的情况
- Java中所有类默认继承自
Object类,而Object的equals方法默认逻辑是比较对象的内存引用地址——简单说就是判断两个变量是不是指向堆里的同一个实例。 - 你用
new User("Alex",1)创建了两个完全独立的对象,它们在内存里是两个不同的地址,所以equals自然返回false,这是Java的默认行为。
再看Kotlin的情况
你看到的true结果,大概率是因为你的Kotlin User类是用data class定义的(比如data class User(val name: String, val age: Int)):
- Kotlin为
data class提供了自动生成代码的特性,其中就包括基于类中所有属性的equals和hashCode方法。 - 这个自动生成的
equals会逐个比较两个对象的每个属性值:只要name和age都分别相等,不管是不是同一个对象实例,都会返回true。
额外验证小技巧
- 如果把Kotlin的
User改成普通类(去掉data关键字),再运行你的代码,结果会和Java一样变成false——因为此时Kotlin的equals默认也是引用比较。 - 反过来,要是在Java的
User类里手动重写equals方法,让它比较name和age的取值,那你的Java代码也会输出true。
内容的提问来源于stack exchange,提问作者ir2pid
相关产品推荐
相关产品推荐

