【发布时间】:2015-03-04 14:27:42
【问题描述】:
我几乎可以肯定做错了什么或误解了 List.retainAll()。
我有两个相等的列表 (size() ==1),但是当我调用 list1.retainAll(list2) 时,列表 1 变为空。
代码:
List<DomainObject> list1 = someService.getData()
List<DomainObject> list2 = someService.getOtherData()
log.info("Equal: ${list1.equals(list2)}")
boolean changed = list1.retainAll(list2)
log.info("Changed: ${changed}")
log.info("list1 empty: ${list1.isEmpty()}")
日志显示:
Equal: true
Changed: true
list1 empty: true
我……不知道我做错了什么。我已经用更通用的对象运行了测试(实际的域对象相当复杂,但是正确地实现了 equals/hashcode)并且 retainAll 按预期工作。
我什至不确定我应该问什么具体问题...是否存在我缺少的条件,其中 equals() 可以返回 true 但 retainAll() 失败?
【问题讨论】:
-
您能否展示您的
equals和hashCode实现 - 在存在延迟加载代理的情况下,您必须在 @ 中非常小心一些事情987654325@ 实施,比平时更多。 -
我继续努力,最终开始比较每个
List的第一个元素,结果不是equal(尽管让我感到困惑的是,列表被评估为equal当第一个元素没有时。equals() 方法使用if(getClass() != o.class) return false失败,因为 o.class 是javaassist对象。