hashCode方法在HashSet中调用System.out.println()方法

时间:2014-03-10 07:22:21

标签: java hashcode

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方法?

3 个答案:

答案 0 :(得分:3)

找到以下打印Hash两次的原因

  1. 当您将Employee插入HashSet

  2. 时查找哈希值
  3. 当您打印该集时,它会在hashCode()类的默认toString()方法中调用Object方法。

  4. 来自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()时会再次调用它。