违反传递性会导致集合行为不可预测:treeset排序错乱或抛异常,hashset去重失败,arraylist.contains/remove结果不稳定,问题静默且难复现。

违反传递性会让集合行为变得不可预测,不是偶尔出错,而是逻辑层面崩塌。
TreeSet 排序错乱甚至抛异常
TreeSet 依赖元素间的可比性维持红黑树结构。当传递性失效时,它可能把本该等价的两个对象视为“不可比较”,导致:
- 插入顺序不同,最终集合大小不同(比如 add(p1, s1, s2) 得到 2 个元素,而 add(s1, p1, s2) 却得到 3 个)
- 遍历时出现重复或跳过——树节点关系自相矛盾,迭代器可能提前终止或无限循环
- 极端情况下触发 ConcurrentModificationException 类似表现,即使没并发操作
HashMap/HashSet 去重和查找失败
哈希集合虽不直接排序,但传递性崩溃会间接破坏其稳定性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 扩容再哈希时,原本同桶的 a、b、c 因 equals 判定不一致,被分散到不同桶中,后续 containsKey 或 remove 可能找不到
- 同一个逻辑对象反复 add 进 HashSet,看似“去重”失效,实则是 equals 返回结果随比较对象顺序变化而摇摆
- 作为 key 存入 HashMap 后,用另一个逻辑等价但字段组合不同的实例去 get,有时命中有时 null
ArrayList.contains() 和 remove() 行为不稳定
这些线性查找方法完全依赖 equals 的确定性:
- list.contains(x) 可能在 x 刚加入后就返回 false,因为 x.equals(x) 在某些路径下意外为 false(间接暴露传递链断裂)
- remove(x) 调用内部 indexOf,若 equals 对同一对对象在不同调用中返回不同结果,就会漏删或删错
- 没有报错,只有静默错误——结果依赖于遍历顺序和对象构造方式,极难复现和调试
传递性不是“理论上该有”的性质,而是集合类运行时赖以成立的底层契约。一旦松动,问题不会立刻爆发,但只要数据规模变大、集合发生扩容或遍历路径改变,就会集中显现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










