不要使用可變物件作為鍵

2021-09-26 18:38:29 字數 510 閱讀 1675

作為鍵的物件,你要保證它每次呼叫hashcode都返回相同值。這也是為什麼stringbuilder沒有像string那樣用char陣列重寫hashcode方法,而是直接用的繼承自object的hashcode。如果使用可變屬性來寫equals和hashcode方法,會導致使用map,set時一些不可預知的問題,如:

public class hashtest  

public void setmutablefield(int mutablefield)

@override

public boolean equals(object o) else

}@override

public int hashcode()

public static void main(string args)

}

更改可變欄位後,計算出的 hashcode 不再指向舊儲存桶,而 contains() 返回 false.

部分參考自

python不要使用可變物件作為引數的預設值

幽靈乘客例子 如上 如果為空時,bus2和bus3引用的是相同的乙個list,就會造成粗錯誤 實際工作中,如果不想改變某個引數值,那麼通過以上這種賦值也會改變 解決方式self.passenger list passenger 相當於把list passenger passenger 舉個例子 a和...

1 不要使用可變物件作為函式預設值

23 return def list 4.6 in 3 my list 7 out 3 1 9 in 5 my other list 10 out 5 1,2 看到了吧,其實我們本來只想生成 2 但是卻把第一次執行的效果頁帶了進來 11 in 6 import time 12 in 7 def re...

盡量不要使用可變引數

在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 c 語言也繼承了這一語言特性。在採用ansi標準形式時,引數個數可變的函式的原型是 typefuncname typepara1,typepara2,這種形式至少需要乙個普通的形式引數,後面的省...