Java 获得;堆栈溢出错误“;重写哈希代码方法时

Java 获得;堆栈溢出错误“;重写哈希代码方法时,java,hashcode,Java,Hashcode,每当我试图打印B类的哈希代码时,我都会遇到上面提到的错误,请告诉我的代码出了什么问题 class B { @Override public int hashCode(){ System.out.println(this.hashCode()); //return this.hashCode(); } } public class Testing { publi

每当我试图打印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));
     }
 }

嗯,这是一个无止境的递归,因此您会得到
stackoverflowerrror
。 你真正想做的可能是

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());
   }
}

嗯,这是一个无止境的递归,因此您会得到
stackoverflowerrror
。 你真正想做的可能是

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());
   }
}

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

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


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

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



不要从hashCode()方法调用此.hashCode()。这似乎是一个递归函数,它将导致堆栈溢出错误。

不要从hashCode()方法调用此.hashCode()。似乎是递归函数,它将带您去堆栈溢出错误。

您有一个无限递归,
hashCode()
方法调用它自己。在stackoverflow上询问堆栈溢出是多么酷啊!你的意思是
System.out.println(super.hashCode())?(另外,这不会编译,因为你没有返回值)。你能告诉我如何在没有无限递归的情况下重写它吗?@RamChowdary-easy:在你的
hashCode
实现中,不要调用
this.hashCode()
。你有一个无限递归,
hashCode()
方法调用自身。在stackoverflow上询问堆栈溢出的问题非常酷!你的意思是
System.out.println(super.hashCode())?(另外,这不会编译,因为你没有返回值)。你能告诉我如何在没有无限递归的情况下重写它吗?@RamChowdary-easy:在你的
hashCode
实现中不要调用
this.hashCode()
。现在我将在这里得到哪个类哈希代码超类哈希代码?是的,因为除了超级类“
hashCode
”之外,您没有其他实现,所以您将看到它。如果要重写实现,则必须提供它。我的目的是在控制台中打印当前的类重写哈希代码值。@RamChowdary,但只要不实现,您就没有当前的重写哈希。查看我的更新答案。
java.util.Objects.hash(id,name)
比像17和31这样的幻数更可取。现在我将在这里得到哪个类哈希代码超类哈希代码?是的,你会的,因为除了超类“
hashCode
之外没有其他实现。如果要重写实现,则必须提供它。我的目的是在控制台中打印当前的类重写哈希代码值。@RamChowdary,但只要不实现,您就没有当前的重写哈希。查看我的更新答案。
java.util.Objects.hash(id,name)
比像17和31这样的神奇数字更可取。