如何用while/for循环复制数组?Java代码复制失败输出null求原因
嘿,我来帮你搞定这两个技术问题!
问题1:如何用while或for循环将旧数组数据复制到新数组
不管是for还是while循环,核心逻辑都是遍历旧数组的每个元素,把它逐个赋值到新数组对应的位置上。我给你举两个简单的示例:
用for循环实现
// 假设旧数组是oldArr,新数组要保证长度足够容纳旧数组元素 String[] oldArr = {"a", "b", "c"}; String[] newArr = new String[oldArr.length]; for (int i = 0; i < oldArr.length; i++) { newArr[i] = oldArr[i]; // 逐个复制元素到新数组对应位置 }
用while循环实现
String[] oldArr = {"x", "y", "z"}; String[] newArr = new String[oldArr.length]; int i = 0; while (i < oldArr.length) { newArr[i] = oldArr[i]; i++; // 手动推进循环计数器 }
问题2:你的Java代码复制失败的原因分析
咱们把代码里的问题拆开来逐一梳理:
错误1:扩容逻辑触发时机完全错误
你现在每次调用add方法都会执行扩容(创建newElements),但实际上只有当数组已满(currsize == elements.length)时才需要扩容。当前写法会导致每次添加元素都重新创建空数组,之前的元素直接丢失!
错误2:循环里的赋值逻辑搞反了,根本没复制元素
你写的循环代码:
for (int i = 0; i < currsize; i++){ elements = newElements; }
这行代码是把空的newElements赋值给elements,循环多少次就重复赋值多少次,但完全没有把旧数组的元素复制到新数组里!正确的操作应该是把elements[i]的值赋给newElements[i]。
错误3:扩容后数组引用的赋值时机错误
就算你完成了元素复制,现在的逻辑是在循环里重复赋值数组引用,这完全没必要——应该在所有元素复制完成后,再把newElements赋值给elements。
修正后的代码
我给你调整好的版本,你可以参考:
public class StrList { // 补充你原代码缺失的成员变量定义 private String[] elements = new String[10]; // 初始数组长度设为10 private int currsize = 0; private String[] newElements; public void add(String y) { // 仅当数组满了才触发扩容 if (currsize == elements.length) { int newSize = elements.length * 2; newElements = new String[newSize]; // 把旧数组元素逐个复制到新数组 for (int i = 0; i < currsize; i++) { newElements[i] = elements[i]; } // 将原数组引用指向新数组 elements = newElements; System.out.println("数组已扩容,新长度为:" + newSize); } // 添加新元素到数组末尾 elements[currsize] = y; currsize++; } }
这样修改后,数组会在容量不足时自动扩容,元素也能正确复制,不会再出现打印null的情况啦。
内容的提问来源于stack exchange,提问作者user9270836
相关产品推荐
相关产品推荐

