作為鍵的物件,你要保證它每次呼叫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,這種形式至少需要乙個普通的形式引數,後面的省...