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

Java 1.6如何从子类集合中获取无重复的父类列表?

解决父类列表重复问题的核心方案

嘿,我一眼就看出问题所在啦!你遇到的重复添加父类的问题,核心原因是你的ParentClass没有正确重写equals()和hashCode()方法。

为什么会出现重复?

Java中ArrayList的contains()、indexOf()方法,还有HashSet的去重逻辑,默认都是基于对象的引用地址来判断相等性的(也就是Object类自带的equals()逻辑)。你每次通过parentClassDaoImpl.findParent()查询出来的ParentClass对象,哪怕对应数据库里的同一条父类数据,都是堆内存里的新实例——它们的引用地址不一样,所以contains()会错误地认为这是不同的对象,导致重复添加到列表中。

第一步:给ParentClass重写equals()和hashCode()

我们需要根据父类的唯一标识(比如id字段)来定义“相等”的规则,这样只要两个ParentClass对象的id相同,就会被判定为同一个对象。示例代码如下:

public class ParentClass {
    private Long id;
    // 其他属性、getter、setter方法

    @Override
    public boolean equals(Object o) {
        // 先判断是否是同一个引用
        if (this == o) return true;
        // 判断是否为null或者类型不匹配
        if (o == null || getClass() != o.getClass()) return false;
        // 强制转换后比较唯一标识
        ParentClass that = (ParentClass) o;
        return id != null ? id.equals(that.id) : that.id == null;
    }

    @Override
    public int hashCode() {
        // 基于id生成哈希值,保证相等的对象哈希值一致
        return id != null ? id.hashCode() : 0;
    }
}

第二步:优化你的去重代码(可选但更优雅)

重写方法后,你原来的contains()判断逻辑就能正常工作了。不过更推荐用Set来处理去重场景,因为Set本身就不允许重复元素,不需要手动判断:

// 用HashSet自动去重
Set<ParentClass> parentsSet = new HashSet<ParentClass>();
// 把DAO实例提到循环外,避免重复创建对象
ParentClassDaoImpl parentDao = new ParentClassDaoImpl();

for(ChildClass child : childs){
    ParentClass parent = parentDao.findParent(child.getParentId());
    parentsSet.add(parent); // Set会自动过滤重复对象
}

// 如果最终需要List类型,直接转换即可
List<ParentClass> parents = new ArrayList<ParentClass>(parentsSet);

额外建议:一步完成去重+统计子类数量

既然你的最终目的是统计每个父类对应的子类总数,其实可以用Map直接一步到位,不需要先去重再统计:

Map<ParentClass, Integer> parentChildCountMap = new HashMap<ParentClass, Integer>();
ParentClassDaoImpl parentDao = new ParentClassDaoImpl();

for(ChildClass child : childs){
    ParentClass parent = parentDao.findParent(child.getParentId());
    // 更新统计数量
    parentChildCountMap.put(parent, parentChildCountMap.getOrDefault(parent, 0) + 1);
}

// 遍历Map查看结果
for(Map.Entry<ParentClass, Integer> entry : parentChildCountMap.entrySet()){
    System.out.println("父类:" + entry.getKey() + ",对应的子类总数:" + entry.getValue());
}

这个方法只需要遍历一次子类列表,同时完成去重和统计,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:37:26