繁体   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