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

Java 11与Java 8中Object.equals()方法行为差异问题咨询

问题解答

核心结论

  • Java 11 的运行结果完全符合Java规范,是正确的
  • 不存在Java 11底层代码出错的可能,问题源于测试代码本身依赖了Java 8的实现Bug

具体原因分析

  1. java.lang.Object的equals方法核心契约明确要求自反性:对于任何非空引用值x,x.equals(x)必须返回true,这是Java官方强制要求所有类的equals实现必须遵守的基础规则。
  2. Java 8 中的HttpsURLConnection实现类(sun.net.www.protocol.https.HttpsURLConnectionImpl)存在已知实现缺陷:它重写了equals方法,但实现逻辑违反了自反性要求,才会出现同一对象自身对比返回false的异常情况。你判断「equals方法未被重写」属于误判,Java 8中该实现类确实重写了equals方法,只是没有遵守规范契约。
  3. Java 11已经修复了该JDK Bug,修正了HttpsURLConnection的equals实现,使其完全符合Object.equals的契约要求,所以同一对象自身对比返回true是符合预期的正确行为。

测试修复建议

你当前的测试代码本身存在逻辑错误:它将JDK的Bug行为作为了正确预期,完全不符合Java语言的规范要求。你需要删除该无效断言,或者调整测试逻辑以适配Java 11的正确实现。

// 原测试代码的断言逻辑违反equals契约,属于无效测试
HttpsURLConnection urlc = setupURLConnection(url);
boolean eqs = urlc.equals(urlc);
assertFalse("Unexpected equals returned", eqs);

内容的提问来源于stack exchange,提问作者sbeven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:45:08