Java修改ArrayList中对象元素时循环次数异常问题排查
排查循环次数异常的问题
嘿,我来帮你分析下这个循环跑了6次而不是预期2次的问题——结合你的需求和给出的代码片段,大概率是遍历逻辑踩了坑,我给你梳理几个最可能的原因:
1. 不小心遍历了多个集合
从你提到的代码里能看到有baratheons和starks两个ArrayList,如果你的方法里同时遍历了这两个集合(比如连续两次for-each循环),那次数就会直接叠加。比如假设每个集合有3个元素,3+3刚好就是6次,完美匹配你遇到的情况。
举个典型的错误写法:
// 错误示例:同时遍历两个集合,导致次数翻倍 for (Lord lord : baratheons) { // 你的处理逻辑 } for (Lord lord : starks) { // 同样的处理逻辑 }
而你的需求应该是只遍历当前Lord所在的那一个集合——比如当前Lord是拜拉席恩家族的,就只遍历baratheons集合就行。
2. 集合里混了重复的Lord对象
如果你的ArrayList里不小心把同一个Lord实例加了好几次(比如重复调用add()),那遍历的时候次数自然会多。你可以先加两行代码打印集合大小,确认下元素数量:
System.out.println("拜拉席恩家族人数:" + baratheons.size()); System.out.println("史塔克家族人数:" + starks.size());
要是某个集合的size远大于你预期的2,那问题就出在这了。
3. 不小心写了嵌套循环
如果你的方法里搞了嵌套循环(比如外层遍历集合,内层又遍历了一次同一个集合),那次数会是n*n的增长。比如集合有2个元素,嵌套循环就会跑4次,再加上其他额外操作,总次数可能就到6次了。比如这种错误写法:
// 错误示例:嵌套循环导致次数平方增长 for (Lord lord : baratheons) { for (Lord otherLord : baratheons) { // 处理逻辑 } }
给你个正确的实现参考
假设当前执行方法的Lord是currentLord,且它属于baratheons集合,正确的写法应该是这样:
public void updateRelationships(Lord currentLord) { // 只遍历当前Lord所属的集合 for (Lord lord : baratheons) { // 注意:如果是自定义对象,建议重写equals(),用equals判断更稳妥 if (lord.equals(currentLord)) { lord.setRelationship(lord.getRelationship() + 10); } else { lord.setRelationship(lord.getRelationship() + 3); } } }
这里要注意两个关键点:
- 只遍历当前Lord所在的单个集合,别碰另一个集合
- 判断是否为当前对象时,要是你自定义了Lord类,记得重写
equals()和hashCode(),避免用==判断对象引用的坑
你先按上面这几个方向排查下,尤其是集合遍历的范围和有没有嵌套循环,应该很快就能找到问题所在啦。
内容的提问来源于stack exchange,提问作者SwampCrawford
相关产品推荐
相关产品推荐

