[英]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
時,將調用bear1
和bear2
的hash
方法,因為它們的值equals
相同的值(即100),也將調用equals
。
對hashCode
方法的額外調用是由於println(setBears)
。 它顯示了哈希集中每個對象的哈希。
因此,在創建HashSet時,它最多會添加兩個hashCode
調用(每個熊為一個)和一個equals
調用以解決並列問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.