代码之家  ›  专栏  ›  技术社区  ›  Ravi Godara

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

  •  1
  • Ravi Godara  · 技术社区  · 11 年前
    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方法2次。为什么在System.out.println()上调用hashcode方法?

    3 回复  |  直到 11 年前
        1
  •  3
  •   Abimaran Kugathasan    11 年前

    查找以下打印原因 Hash 两次

    1. 用于在插入 Employee 进入 HashSet

    2. 当您打印集合时,它会调用 hashCode() 默认值内的方法 toString() 方法来自 Object

    默认值 到字符串() 方法来自 对象 类API文档表示

    这个 到字符串() 类Object的方法返回一个字符串,该字符串由 对象是其实例的类的名称,at符号 字符“@”和哈希的无符号十六进制表示 对象的代码。换句话说,此方法返回一个字符串 值为:

    getClass().getName() + '@' + Integer.toHexString(hashCode())
    
        2
  •  1
  •   Avery Ryan McConn    11 年前

    看见 this 简而言之,默认的toString()函数调用hashCode(),并使用哈希的十六进制表示作为字符串的一部分。

        3
  •  1
  •   Mureinik    11 年前

    第一次呼叫 hashCode() 在添加 Employee 到您的 set 变量,因为它是计算放入哪个桶所需的。

    第二个电话是有点运动鞋。任何 Collection 的默认值 toString() 是所有元素的彗差分隔的凹形 到字符串() s由方括号(例如。, [object1, object2] ). 任何对象的默认值 到字符串() ,如果你不覆盖它 getClass().getName() + "@" + Integer.toHexString(hashCode()) 。这里,因为你不覆盖 受雇者 到字符串() ,打印时再次调用 设置 .