当前位置: 首页 > news >正文

集合中Comparable接口和Equals方法的冲突

equals方法是在讲解集合的时候讲到的,因为集合的特点是,无序,不重复,无索引,LinkedHashSet有序是因为,它的底层是通过双向链表和哈希表共同完成的。通过双向链表来获取第一个第二个元素。从而保证添加顺序和遍历的顺序是一样的。

HashSet和LinkedHashSet保证存储元素不重复的方法是通过equals方法。

而TreeSet保证元素不重复的方法是通过。比较方法,即Comparable或Comparator

矛盾分析

举个例子

如果说我只按照总分来排序,那么在遇到总分一样,而其他属性不一样的时候,它是怎么排序的?

如果使用TreeSet或TreeMap(它们基于红黑树),当比较结果为0时,会认为两个对象相等,那么后添加的元素会替换掉前面的(在Set中不会添加重复元素,在Map中会覆盖值)。

核心问题TreeSet 使用 compareTo() 判断元素是否相等,而其他集合(如 HashSet)使用 equals()。当这两种方法对"相等"的定义不一致时,会导致:

  1. 同一对象在不同集合中被判定为不同

  2. 违反 Set 接口的基本契约(不允许重复元素)

会导致破坏 Set 契约

  1. Set 应包含唯一元素
  2. 当 compareTo() 返回 0 但 equals() 返回 false 时,TreeSet 会错误地拒绝添加本应不同的元素

解决方案

保持一致性

确保 compareTo() 与 equals() 对相等的定义一致:

@Override
public int compareTo(Product other) {// 使用与 equals() 相同的字段组合int result = this.id.compareTo(other.id);if (result == 0) {result = this.name.compareTo(other.name);}return result;
}

一定能通过各种属性判断,区分出两个对象,从而不会出现误判现象

http://www.dtcms.com/a/295940.html

相关文章:

  • 【Mermaid 离线工具】Mermaid 流程图生成器 - 高清PNG输出,一键生成专业级流程图!
  • 共创养生新时代——2025酵素益生产品展暨中秋滋补选品节即将开启
  • QT6 源(165)模型视图架构里的所有的信号函数概览
  • UNETR++: Delving Into Efficient and Accurate 3D Medical Image Segmentation
  • 深度分析Java内存模型
  • 【全新上线】境内 Docker 镜像状态监控
  • 算法第三十八天:动态规划part06(第九章)
  • 【shell脚本编程】day1 备份指定文件类型
  • Unreal5从入门到精通之 动画蓝图 快速入门
  • ML1-ETO 阳性白血病的复发与 LSC 的持续存在密切相关
  • 2025智能BI⼯具竞品深度解析:DataFocus如何挑Tableau与PowerBI的霸主地位?
  • OpenCV图像插值、边缘填充、图像掩膜、噪声消除实战指南
  • 华为仓颉编程语言的表达式的特点
  • 网安学习NO.18
  • 深入掌握CSS Grid布局:每个属性详解与实战示例
  • MySQL 8.4.4详细下载安装配置
  • 【论文阅读】REVISITING DEEP AUDIO-TEXT RETRIEVAL THROUGH THE LENS OF TRANSPORTATION
  • 全面解析 CSS Flex 布局:从入门到精通的所有属性详解
  • DeepSeek-R1+豆包迭代一次完成中国象棋游戏
  • Qwen3-Coder实现中国象棋游戏的尝试
  • Java网络编程入门:从基础原理到实践(二)
  • 计算机网络简答题(大雪圣期末参考资料)
  • Redis哨兵模式(Sentinel)底层实现原理详细介绍
  • Python函数式编程之美:深入理解生成器与高阶函数
  • Product Hunt 每日热榜 | 2025-07-24
  • Java技术栈/面试题合集(17)-Git篇
  • 排序查找算法,Map集合,集合的嵌套,Collections工具类
  • Django实时通信实战:WebSocket与ASGI全解析(上)
  • LAYOUT 什么时候需要等长布线?
  • CodeBuddy IDE发布:编程新时代的颠覆者?