Java中ArrayList调用removeAll删除自定义Availability对象失效问题求助
问题根因
Java 官方规范明确要求:如果两个对象调用equals()返回true,那么它们的hashCode()必须返回相同的整数。你只重写了equals()方法,没有重写hashCode(),破坏了该约定。
如果你的busyTimes是HashSet等哈希结构的集合,或者后续做差集时用到了哈希相关操作,会先通过哈希值快速定位对象,哈希值不同就会直接判定为对象不相等,不会再调用equals()做校验,导致匹配不到要删除的元素。哪怕busyTimes是ArrayList,也建议严格遵守equals和hashCode的重写约定,避免其他场景出现逻辑异常。
解决方案
在Availability类中新增hashCode()方法的重写,逻辑和equals()保持一致即可:
@Override public int hashCode() { return Objects.hash(doctorid, specialty, date, order_of_appointment); }
优化方案(可选)
原生ArrayList.removeAll()的时间复杂度为O(n*m)(n为allTimes长度,m为busyTimes长度),数据量大时效率较低。可以先把busyTimes转为HashSet再过滤,复杂度降到O(n+m):
Set<Availability> busySet = new HashSet<>(busyTimes); List<Availability> freeTimes = allTimes.stream() .filter(item -> !busySet.contains(item)) .collect(Collectors.toList());
补充排查点
如果重写hashCode()后仍然不生效,可以检查以下问题:
- 确认
date字段的类型是否统一,避免java.util.Date和java.sql.Date混用导致equals判定失败 java.util.Date的equals会比较毫秒级时间戳,如果仅日期部分相同、时分秒不同也会判定为不相等。如果业务只需要比对日期,可以将date字段替换为LocalDate(Java 8+)存储,避免时分秒干扰- 确认
equals方法没有被重载(你当前的参数是Object类型,写法是正确的,不需要修改)
内容的提问来源于stack exchange,提问作者Said Hamed
相关产品推荐
相关产品推荐

