Java 如何使用户定义的类==的行为与字符串相同==
我试图理解object==操作符比较的内部实现,以便为我的用户定义类对象实现与String==相同的行为 下面是我的实现逻辑 1。Bean类Java 如何使用户定义的类==的行为与字符串相同==,java,underscore-java,Java,Underscore Java,我试图理解object==操作符比较的内部实现,以便为我的用户定义类对象实现与String==相同的行为 下面是我的实现逻辑 1。Bean类 package com.study.equals; public class SomeBean { int id; public SomeBean(int id) { this.id = id; } @Override public boolean equals(Object o
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。测试类
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() + "]";
}
}
包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
如果obj1
和obj2
指的是完全相同的对象,则返回true
obj1.equals(obj2)
可以(与您的案例一样)比较两个对象的内容,并且可以为两个不同的对象返回true,因为实现了方法equals
通过语句obj1=obj2
可以获得相同的对象(堆内存中的相同地址,相同引用)
如果你这样做
obj1 = new ...
obj2 = new ...
这始终是两个不同的对象。您强制java生成两个新对象。根据
==
的规定,当您要比较对象时,这些对象永远不可能相同。FTR:我在很久以前创建了一个突出显示一些角点的示例。@Progman through equals()我可以,但我的问题是,为什么我不能通过==像String==那样来实现它。==只适用于代码中的常量字符串文本,编译器(使用字符串池)对其进行不同的处理。对于“new String()”,==的工作方式与您的示例中的工作方式相同。只需注意new String(“abc”)==“abc”
或new String(“abc”)==new String(“abc”)
也将返回false
。您的代码所做的与此语句的含义类似:“完全相同的对象”?拥有相同的hashcode()、对象值和相同的toString()是否不能使新对象符合相同的条件?如果不是,那么是什么让另一个对象完全相同呢?不,相同的对象意味着它在Java堆内存中有相同的位置。相同(=
)和相等(等于
)之间的细微差别——第一种情况只是一个实例,第二种情况是具有相同内容的不同实例(取决于定义)@Chandan指向对象的变量称为引用:它指的是对象所占用的特定内存。如果我执行Object b=a
,那么我确保变量b
指向与a
相同的对象。然后,也只有在那时,a==b
返回true
。相反,new
操作符总是分配一段新内存,并创建这个对象。请注意,术语Object
只是人类头脑中的一个概念,机器只有一个字节序列来保存特定对象的数据。