簡體   English   中英

Arraylist在從磁盤加載后無法比較對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM