簡體   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