因为等于方法实现而导致无限循环的OutOfMemoryError

时间:2017-04-21 05:18:03

标签: java equals

我只是想了解equals方法。我在自定义类中重写此方法只是为了查看行为但由于无限循环而导致内存错误。我知道重写equals方法的合同 1)反身性 2)对称性 3)传递性 4)一致 5)对于任何空引用,它必须返回false

public class Reflexivity 
{
   public static void main(String[] args) {
    Reflexivity reflexivity = new Reflexivity();
    Reflexivity reflexivity1 = new Reflexivity();
    System.out.println(reflexivity.equals(reflexivity1));
    }
@Override
public boolean equals(Object obj) {
     if (obj == this) {
            return true;
        }
     if (!(obj instanceof Reflexivity)) {
            return false;
        }
    // TODO Auto-generated method stub
    return this.equals(obj);
 }
}

3 个答案:

答案 0 :(得分:1)

你的实施是无稽之谈!

如果您有两个不同的Reflexivity个对象,那么您将继续永远调用equals(或者您的内存不足等)。

在某些时候,你实际上需要编写一些代码来决定两个对象是否相等......

答案 1 :(得分:0)

您正在递归调用equals方法。在没有任何终止条件的情况下,它会导致无限循环。

由于第一个和第二个if语句返回false,它最终每次都会调用自身,因此是一个无限循环。

答案 2 :(得分:0)

语句this.equals(obj)导致无限递归循环,一次又一次地调用equals()。由于您的班级没有任何州,Object.equals()的行为正是您所需要的。因此,根本不要覆盖equals()