我几乎可以肯定在做错什么或误解了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()失败的地方,我是否缺少条件?
最佳答案
希望可以帮助其他人,这是我应该知道并且曾经遇到过的事情。
list1.equals(list2) //true, one element per list
list1.get(0).id == list2.get(0).id //true, same DB object
list1.get(0).equals(list2.get(0)) //false... ?!
原因是equals()的实现始于:
equals() {
if(getClass() != o.class) return false
}
getClass()返回
DomainObject
,但是o.class
(或o.getClass()
)返回javaassist__blahblah
。我把支票换成了
if(!(o instanceof DomainObject)) return false
不知道这是否是在equals中进行类检查的最干净方法,由于某种原因,我感到
instanceof
很慢。