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
方法并实现它。

操作符不检查类数据是否相等;相反,它检查它们是否在内存中的相同位置。如果did
o2=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这就是为什么我说
但是,这不是一个好例子