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
}
}
如果我们打印set,上面的代码调用hashCode方法2次。为什么在System.out.println()上调用hashcode方法?
答案 0 :(得分:3)
找到以下打印Hash
两次的原因
当您将Employee
插入HashSet
当您打印该集时,它会在hashCode()
类的默认toString()
方法中调用Object
方法。
来自toString()
类API文档的默认Object
方法
类Object的
toString()
方法返回包含的字符串 对象是实例的类的名称,at-sign 字符“@”,以及散列的无符号十六进制表示 对象的代码。换句话说,此方法返回一个相等的字符串 价值:getClass().getName() + '@' + Integer.toHexString(hashCode())
答案 1 :(得分:1)
见this。简而言之,默认的toString()函数调用hashCode()并使用散列的十六进制表示作为String的一部分。
答案 2 :(得分:1)
在向hashCode()
变量添加Employee
时会执行对set
的第一次调用,因为它需要计算将其放入哪个存储区。
第二个电话有点运动鞋。任何Collection
的默认toString()
都是由方括号(例如toString()
)括起的所有元素[object1, object2]
的逗号分隔的连接。任何对象的默认toString()
,如果您不覆盖它,则为getClass().getName() + "@" + Integer.toHexString(hashCode())
。在此处,由于您未覆盖Employee
的{{1}},因此在您打印toString()
时会再次调用它。