问题:为什么使用ArrayList的remove(obj)却删除了下标0的元素?入参明明是对象3(如下图)
解决方案:
入参改为int使用下标删除;
不再让Bbb继承Aaa;
结论:
因为@data重写了Bbb的equals方法,但里面只包含了Bbb的属性,所以遍历集合使用equals匹配时删除了错误的对象
详细验证过程:
1、根据debug或阅读源码发现,remove(obj)是调用泛型类的equals方法进行比较,如果equals返回true那么删除(如下图)
2、那么问题就出现在Bbb的equals上了,但Bbb并未手动重写equals方法
3、通过class文件发现@Data帮助我们重写了equals方法(如下图),并通过60-68行的观察发现,@Data重写的equals方法中只针对了Bbb的属性进行对比,并未比较Aaa的属性,又因为示例中集合各元素的差异为name(即Aaa的属性),所以影响了ArrayList的remove(obj)方法使用equals比较,从而导致只删除了下标0的元素
如果你喜欢这篇文章或本文对你有帮助记得点个赞[]~( ̄▽ ̄)~*