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

如何统计ArrayList中各类型对象数量?用instanceof还是getClassName?

统计ArrayList中各子类实例数量的解决方案

嘿,我来帮你补全这个统计实例数量的方法!这里有两种靠谱的实现方式,你可以根据需求选择:

方法一:通过类名字符串匹配(延续你已有的代码思路)

这种方式直接沿用你已经写的getClass().getSimpleName()逻辑,通过匹配类名字符串来统计:

public static void test2(ArrayList<One> v){
    String className = "";
    int countOne = 0, countTwo = 0, countThree = 0;
    for (int i = 0; i < v.size(); i++) {
        className = v.get(i).getClass().getSimpleName();
        
        // 补全的判断逻辑
        switch(className) {
            case "One":
                countOne++;
                break;
            case "Two":
                countTwo++;
                break;
            case "Three":
                countThree++;
                break;
            // 可选:处理未知类型的情况
            default:
                System.out.println("发现未统计的类:" + className);
        }
    }
    
    // 输出统计结果
    System.out.println("One的实例数量:" + countOne);
    System.out.println("Two的实例数量:" + countTwo);
    System.out.println("Three的实例数量:" + countThree);
}

注意:这种方式依赖类的简单名称字符串,如果后续类名被修改,统计逻辑会失效,适合类名稳定的场景。

方法二:使用instanceof关键字(更安全的继承关系判断)

这种方式利用Java的instanceof关键字判断对象的实际类型,不需要依赖字符串,而且能正确处理继承层级(必须先判断最具体的子类,避免父类判断覆盖子类):

public static void test2(ArrayList<One> v){
    int countOne = 0, countTwo = 0, countThree = 0;
    // 用增强for循环更简洁易读
    for (One obj : v) {
        if (obj instanceof Three) {
            countThree++;
        } else if (obj instanceof Two) {
            countTwo++;
        } else if (obj instanceof One) {
            countOne++;
        }
    }
    
    // 输出统计结果
    System.out.println("One的实例数量:" + countOne);
    System.out.println("Two的实例数量:" + countTwo);
    System.out.println("Three的实例数量:" + countThree);
}

优势:不依赖类名字符串,即使类名修改也不影响统计逻辑,是更健壮的实现方式。

用你给出的示例集合测试的话,两种方法都会输出:

One的实例数量:1
Two的实例数量:1
Three的实例数量:1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:29:45