Java 具有相同数据的两个对象是否不相同?
我有一个这样的测试类:Java 具有相同数据的两个对象是否不相同?,java,object,compare,equals,Java,Object,Compare,Equals,我有一个这样的测试类: public class CompareObjects { public static class Obj { public int i; public Obj(int i) { this.i = i; } } public static void main(String[] args) { Obj o1 = new Obj(0); Obj o2 = new Obj(0); if(o1 == o2)
public class CompareObjects {
public static class Obj {
public int i;
public Obj(int i) {
this.i = i;
}
}
public static void main(String[] args) {
Obj o1 = new Obj(0);
Obj o2 = new Obj(0);
if(o1 == o2) {
System.out.println("Equal");
}else{
System.out.println("Not equal");
}
}
}
我原以为测试结果会是“相等”,但事实并非如此。为什么java不考虑两个具有相同组件的对象不一样?我做错什么了吗?我有一种感觉,当我开始学习Java时,我完全忽略了一些东西
另外,我用equals()方法测试了这两个函数,得到了相同的结果。我回答这个问题的原因是,我希望能够使用contains()方法测试ArrayList,以查看一个对象是否与另一个对象具有相同的组件,因此是否相等。有什么想法吗?
=
只有在比较同一对象[即同一内存位置]时才会返回true
如果要按对象的字段比较对象,则必须重载equals()
方法,以便对它们进行比较
public boolean equals(Object other){
return this.i == other.i;
}
确保
equals()
方法尊重自反性、对称性和传递性。=
仅当您比较相同的对象[即相同的内存位置]时,才会返回true
如果要按对象的字段比较对象,则必须重载equals()
方法,以便对它们进行比较
public boolean equals(Object other){
return this.i == other.i;
}
确保
equals()
方法尊重反射性、对称性、传递性。==
比较引用相等,即如果它们引用内存中的同一对象
您需要重写
equals()
方法,并在需要比较它们的值时使用它。另外,覆盖HashMap使用的hashCode()
。=
比较引用相等,即它们是否引用内存中的同一对象
您需要重写
equals()
方法,并在需要比较它们的值时使用它。另外,重写HashMap使用的hashCode()
。==
将引用与对象进行比较。例如:
Obj a = new Obj(0);
Obj b = a;
//a == b
尝试实现equals()
:
然后,您可以使用
if(o1.equals(o2)){
。但是,这不是一个很好的示例,请阅读以了解更多信息。=
将引用与对象进行比较。例如:
Obj a = new Obj(0);
Obj b = a;
//a == b
尝试实现equals()
:
然后,可以使用
if(o1.equals(o2)){
。然而,这并不是一个很好的示例,请阅读以了解更多信息。操作符不检查类数据是否相等;相反,它检查它们是否在内存中是相同的位置。如果您使用了o2=o1
而不是以相同的方式初始化它们,它们将在内存中是相同的位置,因此o2==o1
将返回true
。但是,由于它们是单独初始化的,因此返回false。相反,您应该定义一个equals
方法并实现它。操作符不检查类数据是否相等;相反,它检查它们是否在内存中的相同位置。如果dido2=o1
不是以同样的方式初始化它们,而是它们在内存中的相同位置,因此o2==o1
将返回true
。但是,由于它们是单独初始化的,所以返回false。相反,您应该定义一个equals
方法并实现它。我所做的最基本的事情之一java是equals
和==
之间的区别,实现您自己的“equals”。==检查它们是否是相同的对象,在本例中,这与它们的属性无关。@gefei:是的,我知道。它们都返回“notequal” though@JBNizet:这样的响应有什么好处?java中最基本的东西之一是equals
和=
实现您自己的“equals”之间的区别。==检查它们是否是相同的对象,在这种情况下与它们的属性无关。@gefei:是的,我知道。它们都返回“不平等”though@JBNizet:这样的响应有什么好处?moonwave99键入的速度比我快。请同时覆盖hashCode()
。不这样做是错误。moonwave99键入的速度比我快。请同时覆盖hashCode()
。不这样做是错误。请同时覆盖hashCode())
。不这样做是一个错误。@JBNizet这就是为什么我说,但是,这不是一个好例子
请也重写hashCode()
。不这样做是一个错误。@JBNizet这就是为什么我说但是,这不是一个好例子