繁体   English   中英

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

[英]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的以下原因

  1. 用于在将Employee插入HashSet时查找哈希值

  2. 当您打印集时,它将在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()) 在这里,由于您没有覆盖EmployeetoString() ,因此在打印set时会再次调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM