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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:00:58