You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:24:04