[英]Arraylist can't compare objects after they are loaded from disk
為了方便arraylist allBooks
,讓我說我有一個arraylist allBooks
包含類“書”和一個arraylist someBooks
包含一些但不是所有的“書”。
當我想看一個arraylist中的一本書是否也包含在另一個arraylist中時,使用contains()方法工作正常。
問題是,當我將兩個Arraylists保存到.bin文件並在程序重新啟動后加載它們時,這不再起作用了。 執行與以前相同的測試,即使比較的對象相同(內部具有相同的信息),contains()也返回false。
我通過重載equals方法解決了它,它工作正常,但我想知道為什么會發生這種情況?
您必須提供自己的哈希碼並等於實現。 默認情況下,它只會使用指針相等,這在對象被“克隆”(序列化/反序列化循環)后顯然會失敗。
發生的事情是,當您最初創建列表時,它們都包含對相同對象的引用,但是當您將它們加載回來時,它們都獲得了相同對象的單獨副本。 由於每個列表都有單獨的副本,因此它們不包含相同的引用,這意味着它們不會在沒有重載正確方法的情況下進行比較。
這聽起來像是引用平等與Equals
的共同問題,在序列化中尤為常見。 適當地覆蓋Equals
(和GetHashCode
),你應該重新開始工作。
有關信息, 通常應避免使用ArrayList
除非您使用的是.NET 1.1(或微框架),或者有非常有效的理由這樣做; 更喜歡通用類型集合,例如List<T>
。
假設book
是一個對象,默認情況下Equals
檢查引用是否相等。 加載新對象時不會出現這種情況。 覆蓋Equals
方法是一種正確的方法。
其他選項是將Book
更改為結構,或使用更現代的容器,如字典或哈希表,您可以通過id存儲書籍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.