[英]hashCode method called for System.out.println() method in HashSet
import java.util.HashSet;
import java.util.Set;
class Employee {
@Override
public int hashCode() {
System.out.println("Hash");
return super.hashCode();
}
}
public class Test2 {
public static void main(String[] args) {
Set<Employee>set= new HashSet<>();
Employee employee = new Employee();
set.add(employee);
System.out.println(set);// if we comment this "Hash" will be printed once
}
}
如果我们打印集,以上代码将调用hashCode方法两次。 为什么在System.out.println()上调用哈希码方法?
找到两次打印Hash
的以下原因
用于在将Employee
插入HashSet
时查找哈希值
当您打印集时,它将在Object
类的默认toString()
方法内调用hashCode()
方法。
Object
类API文档中的默认toString()
方法表示
类Object的
toString()
方法返回一个字符串,该字符串包括该对象是其实例的类的名称,符号字符“ @”以及该对象的哈希码的无符号十六进制表示形式。 换句话说,此方法返回的字符串等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
看到这个 。 简而言之,默认的toString()函数调用hashCode()并使用哈希的十六进制表示形式作为String的一部分。
将Employee
添加到您的set
变量时, hashCode()
首次调用,这是计算该存储桶所需要的。
第二个电话有点运动鞋。 任何Collection
的默认toString()
是用方括号(例如[object1, object2]
)将其所有元素toString()
逗号分隔的隐式表示。 任何对象的默认toString()
,如果不覆盖它,则为getClass().getName() + "@" + Integer.toHexString(hashCode())
。 在这里,由于您没有覆盖Employee
的toString()
,因此在打印set
时会再次调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.