Java 获得;堆栈溢出错误“;重写哈希代码方法时
每当我试图打印B类的哈希代码时,我都会遇到上面提到的错误,请告诉我的代码出了什么问题Java 获得;堆栈溢出错误“;重写哈希代码方法时,java,hashcode,Java,Hashcode,每当我试图打印B类的哈希代码时,我都会遇到上面提到的错误,请告诉我的代码出了什么问题 class B { @Override public int hashCode(){ System.out.println(this.hashCode()); //return this.hashCode(); } } public class Testing { publi
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这样的神奇数字更可取。