如何在自定义类的ArrayList集合中使用contains方法?
问题解决:自定义类集合中contains方法失效的处理方案
你遇到的问题核心在于:ArrayList的contains()方法默认依赖对象的equals()方法进行判断,而Java中所有类默认继承的Object类的equals()是比较对象的内存地址,只有当两个对象是同一个实例时才会返回true。但实际场景中我们需要的是比较自定义类的属性值是否一致,因此必须手动重写equals()方法(同时建议重写hashCode(),遵循Java的约定)。
具体实现步骤
在自定义
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); } }正确使用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
相关产品推荐
相关产品推荐

