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

如何在自定义类的ArrayList集合中使用contains方法?

问题解决:自定义类集合中contains方法失效的处理方案

你遇到的问题核心在于:ArrayList的contains()方法默认依赖对象的equals()方法进行判断,而Java中所有类默认继承的Object类的equals()是比较对象的内存地址,只有当两个对象是同一个实例时才会返回true。但实际场景中我们需要的是比较自定义类的属性值是否一致,因此必须手动重写equals()方法(同时建议重写hashCode(),遵循Java的约定)。

具体实现步骤

  1. 在自定义Product类中重写equals()和hashCode()
    假设你的Product类有id和name两个核心属性,以此为例重写方法:

    import java.util.Objects;
    
    class Product {
        private Long id;
        private String name;
    
        // getter、setter方法
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    
        // 重写equals方法,根据属性值判断对象是否相等
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Product product = (Product) o;
            // 处理属性可能为null的情况
            return Objects.equals(id, product.id) && Objects.equals(name, product.name);
        }
    
        // 重写hashCode,与equals保持一致逻辑(属性相同则hashCode相同)
        @Override
        public int hashCode() {
            return Objects.hash(id, name);
        }
    }
    
  2. 正确使用contains()方法
    在main类中,创建要检查的Product对象(属性值与集合中某元素一致即可),直接传入contains():

    import java.util.ArrayList;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList<Product> products = new ArrayList<>();
            // 添加测试数据
            Product p1 = new Product();
            p1.setId(1L);
            p1.setName("手机");
            products.add(p1);
    
            // 创建要检查的对象(属性与p1一致)
            Product checkP = new Product();
            checkP.setId(1L);
            checkP.setName("手机");
    
            // 此时contains会返回true
            boolean checkProduct = products.contains(checkP);
            System.out.println(checkProduct); // 输出true
        }
    }
    

关键说明

  • 重写equals()时必须遵循对称性、自反性、传递性等规则,避免出现逻辑错误。
  • 只要重写equals()就必须重写hashCode(),否则当该类对象用于HashMap、HashSet等哈希集合时会出现异常行为(比如无法正确查找元素)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:22:20