當我只使用一個類而不是資料類或使用ArrayList而不是MutableSet時,問題就消失了。我試圖了解我第一次撰寫它的方式有什么問題并且找不到任何錯誤,但是在運行最后一行時會引發 StackOverflow 錯誤
data class Person(
val id : Int,
val neighbors : MutableSet<Person> = mutableSetOf()
)
fun main() {
val neighbor1 = Person(0)
val commonNeighbor = Person(1)
val neighbor2 = Person(2)
commonNeighbor.neighbors.addAll(listOf(neighbor1,neighbor2))
neighbor1.neighbors.add(commonNeighbor)
neighbor2.neighbors.add(commonNeighbor)
}
uj5u.com熱心網友回復:
(假設您使用的是 Kotlin/JVM)
堆疊跟蹤使這一點更加清晰。請注意,堆疊跟蹤是呼叫這兩個方法的重復。
at bar.Person.hashCode
at java.base/java.util.AbstractSet.hashCode
commonNeighbor讓我們考慮一下neighbour2.neighbours在最后一行添加時會發生什么。
mutableSetOf創建一個鏈接的散列集,并且為了添加到散列集,commonNeighbour需要進行散列。
的實作hashCode是自動生成的,Person因為它是一個資料類,這就是用來散列它的。此實作考慮(即也呼叫)在的主建構式中hashCode宣告的屬性,即和。Personidneighbours
所以要散列commonNeighbours,我們需要散列commonNeighbours.id和commonNeighbours.neighbours。有哪些鄰居commonHeighbours?neighbour1和neighbour2。為了對它們進行哈希處理,我們也需要對它們的鄰居進行哈希處理。可是等等!neighbour1的鄰居之一是commonNeighbours!我們回到了我們開始的地方,創建了一個無限回圈。
所有這一切都不會發生,如果hashCodeofPerson沒有考慮neighbours(這是制作Person非data類會做的事情),或者如果你沒有使用HashSet.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/508439.html
