为了方便起见,我们假设我有一个arraylist allBooks
包含课程“书籍”和arraylist someBooks
包含一些但不是全部的“书籍”。
当我想查看一个arraylist中的书是否也包含在另一个arraylist中时,使用contains()方法工作正常。
问题在于,当我将两个Arraylists保存到.bin文件并在程序重新启动后加载它们时,这不再起作用了。执行与以前相同的测试,即使比较的对象相同(内部具有相同的信息),contains()也返回false。
我通过重载equals方法解决了它并且工作正常,但我想知道为什么会发生这种情况?
答案 0 :(得分:6)
您必须提供自己的哈希码并等于实现。默认情况下,它只会使用指针相等,这在对象被“克隆”(序列化/反序列化循环)后显然会失败。
答案 1 :(得分:2)
当您最初创建列表时,它们都包含对相同对象的引用,但是当您将它们加载回来时,它们都获得了相同对象的单独副本。由于每个列表都有单独的副本,因此它们不包含相同的引用,这意味着它们不会在没有重载正确方法的情况下进行比较。
答案 2 :(得分:2)
这听起来像是引用平等vs Equals
的常见问题,在序列化中尤为常见。适当地覆盖Equals
(和GetHashCode
),您应该重新开始营业。
有关信息,除非您使用的是.NET 1.1(或微框架),或者有充分理由这样做,否则使用ArrayList
通常可以避免 。更喜欢通用类型集合,例如List<T>
。
答案 3 :(得分:1)
假设book
是一个对象,默认情况下Equals
检查引用是否相等。加载新对象时不会出现这种情况。覆盖Equals
方法是一种正确的方法
其他选项是将Book
更改为结构,或使用更现代的容器,如字典或哈希表,您可以按ID存储书籍。