如何统计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
相关产品推荐
相关产品推荐

