Java中如何不使用循环创建独立数组引用 避免排序互相影响
实现方式说明
对于char[]这类存储基本类型的数组,本身不需要手写循环就能创建完全独立的副本,副本和原数组修改互不影响。你遇到副本数组同步被排序的问题,优先检查两处代码逻辑:
- 确认副本创建的时机:拷贝操作必须放在c1所有元素填充完成、执行
Arrays.sort(c1)之前,若拷贝发生在排序之后,拿到的自然是已经排好序的内容 - 确认没有覆盖副本引用:检查代码中是否存在
c2 = c1这类直接引用赋值的写法,这类写法会让c2直接指向c1的内存地址,之前的拷贝操作会完全失效
无需手写循环的可用拷贝方案
以下三种JDK原生方案都可以直接生成独立的char数组副本,不需要自己写遍历循环:
- 方法1:使用数组自带的
clone()方法
基本类型数组调用clone()会直接生成值完全一致的新数组,内存地址独立,正确写法如下:char[] c1 = new char[9]; // 完成c1的元素插入逻辑 char[] c2 = c1.clone(); // 在排序前完成拷贝 Arrays.sort(c1); // 此时c2保留插入时的原始顺序,c1为排序后结果 - 方法2:使用
Arrays.copyOf()
该方法是JDK封装的数组拷贝工具,会按照指定长度拷贝源数组元素生成新数组,写法更直观:import java.util.Arrays; char[] c1 = new char[9]; // 完成c1的元素插入逻辑 char[] c2 = Arrays.copyOf(c1, c1.length); Arrays.sort(c1); - 方法3:使用
System.arraycopy()
这是JDK底层实现的native拷贝方法,性能最优,需要提前初始化目标数组:char[] c1 = new char[9]; // 完成c1的元素插入逻辑 char[] c2 = new char[c1.length]; System.arraycopy(c1, 0, c2, 0, c1.length); Arrays.sort(c1);
补充说明:以上方案仅针对基本类型数组实现值层面的独立拷贝,如果是存储自定义对象的引用类型数组,上述方法拷贝的是对象引用,修改数组内对象属性时仍会互相影响,但char是基本类型,不存在该问题。
内容的提问来源于stack exchange,提问作者Divyansh Singh
相关产品推荐
相关产品推荐

