[英]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
的以下原因
用於在將Employee
插入HashSet
時查找哈希值
當您打印集時,它將在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())
。 在這里,由於您沒有覆蓋Employee
的toString()
,因此在打印set
時會再次調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.