java - 如何使用户定义的 Class == 行为与 String == 相同
问题描述
我试图了解object == 运算符比较的内部实现,以便为我的用户定义的类对象实现String ==的相同行为。
下面是我的实现逻辑。
1. 豆类
package com.study.equals;
public class SomeBean {
int id;
public SomeBean(int id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof SomeBean) {
return this.id==((SomeBean)obj).id;
} else {
return false;
}
}
@Override
public int hashCode() {
return this.id + 2000;
}
@Override
public String toString() {
return "[Inside toString: " + this.hashCode() + "]";
}
}
2. 测试班
包 com.study.equals;
公共类测试{
public static void main(String[] args) {
SomeBean obj1 = new SomeBean(10);
SomeBean obj2 = new SomeBean(10);
if(obj1 == obj2) {
System.out.println("true");
}else {
System.out.println("false");
}
}
}
- 预期输出:真
- 实际输出:假
怀疑
- 有人可以帮助我理解为什么我在这里变得虚假吗?
- 我怎样才能在这里得到真实的回应。
解决方案
obj1 == obj2
true
如果obj1
并且obj2
指的是完全相同的对象,则返回。obj1.equals(obj2)
可以(如您的情况)比较两个对象的内容,并且可以为两个不同的对象返回 true ,因为实现了 method equals
。
您通过语句获得相同的对象(堆内存中的相同地址,相同的引用)obj1 = obj2
。
如果你这样做,
obj1 = new ...
obj2 = new ...
这些总是两个不同的对象。您强制 java 创建两个新对象。根据==
.
推荐阅读
- c# - 使用实体框架映射数据库的方法?
- amazon-web-services - 带有 pod 安全组的 EKS 上的 Traefik
- typescript - 在打字稿中键入索引对象
- flutter - 如何在 Flutter 中检查 DateTimeField 是否(不)为空
- amazon-web-services - Terraform EKS 错误 可能未指定网络接口和实例级安全组
- node.js - 成功获取后反应不显示数据
- html - 为什么开始按钮上有白色边框
- node.js - TypeScript:创建一个类的新实例给我取消定义
- swift - 我找不到 AudioKitUI
- javascript - SpreadJS:即使对于空工作表也显示标题