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

为何无法将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());

代码中的其他潜在问题

  1. 索引越界风险:if (i <= list2.size())判断错误,List的索引从0开始,当i等于list2.size()时,调用list2.get(i)会抛出IndexOutOfBoundsException,应该改为i < list2.size()。
  2. 合并逻辑可能不符合预期:原代码中每次调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:21:11