获取"堆栈溢出错误"而重写哈希码方法

时间:2015-09-23 07:15:34

标签: java hashcode

每当我尝试打印B类哈希码时,我都会遇到上述错误,请告诉我的代码有什么问题?

    class B {
        @Override
        public int hashCode(){
        System.out.println(this.hashCode());    
        //return this.hashCode();
        }   
    }
    public class Testing
    {
      public static void main(String[] args)
      {
       /*A a = new A(0, null, 1.20);
       A a1 = new A(1,null,1.20);
       A a3 = null;*/
       B b = new B();
       System.out.println(b.hashCode());
       //System.out.println(a.equals(a1));
       //System.out.println(a.equals(a1));
     }
 }

3 个答案:

答案 0 :(得分:3)

嗯,这是一个无休止的递归,因此你得到了StackOverflowError。 你真正想做的事情可能是。

class B {
    @Override
    public int hashCode(){
        System.out.println(super.hashCode());    
        //return super.hashCode();
    }   
}

如果你想覆盖你的实现并打印它,你应该这样做,例如这样。

class B {
    private Long id = Long.valueOf(0L);
    private String name = "";

    @Override
    public int hashCode(){
        final int hashCode = 17 * id.hashCode() + 31 * name.hashCode();
        System.out.println(hashCode);    
        return hashCode;
    }   
}

或者如果您只是想打印它,那么在hashCode身体中什么都不做。

class B {}

public class Testing
{
   public static void main(String[] args)
   {
    B b = new B();
    System.out.println(b.hashCode());
   }
}

答案 1 :(得分:3)

你正在hashCode中创建无限递归调用hashCode

class B {
    @Override
    public int hashCode(){//<----------------------┐
    //                                             │ this path is infinite                  
    System.out.println(this.hashCode()); //   <----┘
    //return this.hashCode();
    }   
}

为避免这种情况:

  1. 不要在自己内部调用hashCode
  2. 调用超类hashcode
    注意:如果在这种情况下,class没有直接继承,则始终会调用Object hashCode方法。
    1. 自己编码。
      注意:override并创建有效的hashCode方法,B类中至少需要一个字段。

      @Override
      public int hashCode(){
          // code it, or better, make your IDE code it for you
      }   
      

      }

答案 2 :(得分:1)

不要从hashCode()方法调用this.hashCode()。它似乎是递归函数,它将带你到Stack over flow error。