如何通过List.contains()方法判断特定对象是否存在于集合中?
- 内容介绍
- 文章标签
- 相关推荐
本文共计978个文字,预计阅读时间需要4分钟。
根本原因不是方法本身存在问题,而是它依赖于+equals+判断相等性。如果元素类没有重写+equals+(以及搭配的+hashCode+),默认使用的是+Object.equals+。这也意味着比较的是引用地址而非内容。因此,即使两个对象内容相同,但不是同一个实例,也会被判断为不相等。
常见错误现象:list.contains(new Person("Alice", 25)) 返回 false,哪怕列表里已有另一个 Person("Alice", 25) 实例。
- 必须确保目标类重写了
equals()(且逻辑符合业务含义,比如按 ID 或关键字段比较) -
hashCode()也得一并重写,否则放进HashSet等集合时可能出问题(虽然List.contains()不直接依赖它,但保持契约一致是底线) - 使用 Lombok 的话,加
@EqualsAndHashCode注解最省事;手写注意 null 安全和字段顺序
用 contains() 查基本类型或 String 没问题,但要注意包装类缓存
Integer、String、Boolean 这些 JDK 自带类都已正确实现 equals(),可直接用 contains()。
本文共计978个文字,预计阅读时间需要4分钟。
根本原因不是方法本身存在问题,而是它依赖于+equals+判断相等性。如果元素类没有重写+equals+(以及搭配的+hashCode+),默认使用的是+Object.equals+。这也意味着比较的是引用地址而非内容。因此,即使两个对象内容相同,但不是同一个实例,也会被判断为不相等。
常见错误现象:list.contains(new Person("Alice", 25)) 返回 false,哪怕列表里已有另一个 Person("Alice", 25) 实例。
- 必须确保目标类重写了
equals()(且逻辑符合业务含义,比如按 ID 或关键字段比较) -
hashCode()也得一并重写,否则放进HashSet等集合时可能出问题(虽然List.contains()不直接依赖它,但保持契约一致是底线) - 使用 Lombok 的话,加
@EqualsAndHashCode注解最省事;手写注意 null 安全和字段顺序
用 contains() 查基本类型或 String 没问题,但要注意包装类缓存
Integer、String、Boolean 这些 JDK 自带类都已正确实现 equals(),可直接用 contains()。

