为何无法将ArrayList的size值保存为变量?
问题原因与解决方法
核心问题:变量作用域限制
你定义的maxSize变量是在if和else的代码块内部声明的,根据Java的作用域规则,块内声明的变量仅在当前块内有效,出了对应的if/else块后,这个变量就会被销毁,所以后续的for循环无法访问到它。
修正方法
把maxSize的声明移到if-else块的外部,让它的作用域覆盖整个方法:
public static ArrayList<Integer> merge(ArrayList<Integer> list1, ArrayList<Integer> list2) { // 先在块外声明变量 int maxSize; if (list1.size() >= list2.size()) { maxSize = list1.size(); } else { maxSize = list2.size(); } for (int i = 0; i < maxSize; i++) { // ... 后续代码 } System.out.println(list1); return list1; }
或者用更简洁的Math.max直接赋值:
int maxSize = Math.max(list1.size(), list2.size());
代码中的其他潜在问题
- 索引越界风险:
if (i <= list2.size())判断错误,List的索引从0开始,当i等于list2.size()时,调用list2.get(i)会抛出IndexOutOfBoundsException,应该改为i < list2.size()。 - 合并逻辑可能不符合预期:原代码中每次调用
list1.add(i, nextInList2)会把list2的元素插入到list1的指定位置,这会导致list1的长度不断增加,循环的i < maxSize逻辑会因为list1长度变化出现偏差。如果是要实现交替合并两个列表,建议创建新的ArrayList存储结果,避免修改原列表的同时逻辑混乱。
优化后的合并示例(创建新列表)
public static ArrayList<Integer> merge(ArrayList<Integer> list1, ArrayList<Integer> list2) { ArrayList<Integer> mergedList = new ArrayList<>(); int i = 0, j = 0; // 交替添加两个列表的元素 while (i < list1.size() && j < list2.size()) { mergedList.add(list1.get(i++)); mergedList.add(list2.get(j++)); } // 添加剩余未处理的元素 while (i < list1.size()) { mergedList.add(list1.get(i++)); } while (j < list2.size()) { mergedList.add(list2.get(j++)); } System.out.println(mergedList); return mergedList; }
内容的提问来源于stack exchange,提问作者Ida
相关产品推荐
相关产品推荐

