欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中对==,!=和equals的理解

程序员文章站 2024-02-09 18:14:34
...
在java中==,!=比较的是对象的索引,而equal才是比较对象的内容。如:
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
n1.equals(n2)为true,因为两个对象的内容是相同的
n1 == n2则为false,因为两个对象的索引不相同的

这是对基本类型的定义是这样的,如果是自己定义新对象model时,如果不重写equals方法则默认比较的也是索引,所以在自己定义对象时最好都要重写里面的hashcode和equals方法
这是thinkjava里面的例子
class Value {
int i;
}
public class EqualsMethod2 {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
} 输出为false;


因为对象Value没重写equals方法,所以默认比较的是索引,而v1和v2的索引是不相同的,如果你想通过比较里面的i的值来判断v1和v2是否相等,你就要重写他的hashcode和equals方法了。


[b]项目实践[/b]
在实际项目中重写自定义对象的hashcode和equals方法时也要注意自己的方式,看是否满足需求而定义这个方法,我就犯过一次错误

项目里面有一个对象是Figure,我定义hashcode/equals方法时只定义了id,只要id相同则就认为对象相同,而真正需求则不能满足,他只是满足了页面的显示了,那时id肯定不会为空。
由于在项目中这个对象是和另一个对象是多对一的关系,所以我要用Set集合来存Figure,这时错误就出现了,当我新增加多个Figure对象时,Set里面总是只存一个,因为他比较的是id,由于新增加的对象,还没有id呢,所以默认程序默认他们是相同的对象,最后导致项目运行时出了问题,数据不对,最后我们加了另一个属性name就好了,我们不可能把Figure属性都放在里面的,那样也会不会满足需求的
相关标签: Java