簡體   English   中英

Scala-使用可變HashSet時hashCode的行為等於

[英]Scala - Behaviour of hashCode & equals when using mutable HashSet

情況#1-我有以下課程:

class Bear (val aName: String) { 
   def getName: String = aName
   override def equals (a : Any) : Boolean = { println("Test Equals"); true}      
 }

如果運行以下代碼,則會得到以下結果:

import scala.collection.mutable.HashSet 
val bear1 = new Bear("Black") 
val bear2 = new Bear("Black") 
val setBears: HashSet[Bear] = HashSet (bear1,bear2) 
println(setBears) 

res: Set(scalaproj.Bear@7d4991ad, scalaproj.Bear@28d93b30)

CASE#2-但是,當我將hashCode方法添加到類中時

class Bear (val aName: String) { 
   def getName: String = aName
   override def equals (a : Any) : Boolean = { println("Test Equals"); true}      
   override def hashCode() = { println("Test Hash");100 }
 }

並運行相同的代碼,我得到以下結果:

import scala.collection.mutable.HashSet 
val bear1 = new Bear("Black") 
val bear2 = new Bear("Black") 
val setBears: HashSet[Bear] = HashSet (bear1,bear2) 
println(setBears) 

res: Test Hash
     Test Hash
     Test Equals
     Test Hash
     Set(scalaproj.Bear@64)  

我的兩個問題:

1-案例#2-為什么在定義hashCode方法時會被調用三次-添加“ bear1”時兩次,而添加“ bear2”時一次

2-案例1-為什么在未定義hashCode的情況下根本不調用equals方法-盡管在案例2中被調用了。 (即使是案例類,通常也會在所有情況下調用覆蓋的equals方法)

關於問題2:

當兩個對象具有相同的hashCode ,將調用equals方法來解決“領帶”。 因為在這種情況下哈希是不同的,所以不會調用equals

關於問題1:

實際上,正在發生的事情是,在定義HashSet時,將調用bear1bear2hash方法,因為它們的值equals相同的值(即100),也將調用equals

hashCode方法的額外調用是由於println(setBears) 它顯示了哈希集中每個對象的哈希。

因此,在創建HashSet時,它最多會添加兩個hashCode調用(每個熊為一個)和一個equals調用以解決並列問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM