system.arraycopy不能去重,因为它只是内存级的连续块复制,不比较元素值、不判断重复、不改变数据内容;去重需先用set、stream等逻辑筛选唯一元素,再用arraycopy搬运结果。

System.arraycopy 本身不支持去重,它只负责高效复制数组元素。
要去重,必须先通过其他逻辑(比如遍历、Set、Stream)筛选出唯一元素,再用 System.arraycopy 把结果复制到目标数组中。它只是“搬运工”,不是“筛选器”。
为什么 arraycopy 不能直接去重
System.arraycopy 是 JVM 提供的本地方法,作用是把源数组某段连续内存块,原样拷贝到目标数组指定位置。它:
- 不比较元素值,也不判断重复
- 不改变数据内容,只做内存级复制
- 要求源/目标数组类型兼容,且索引范围合法
正确组合:先去重,再复制
典型流程是:收集唯一元素 → 构建新数组 → 用 arraycopy 搬运(可选,通常直接赋值更自然)。
例如对 int 数组去重并复制到新数组:
int[] original = {1, 2, 2, 3, 4, 4, 5};
// 步骤1:用 LinkedHashSet 保持顺序去重
Set<integer> set = new LinkedHashSet();
for (int x : original) set.add(x);
<p>// 步骤2:转成数组(此时已无重复)
int[] unique = new int[set.size()];
int i = 0;
for (int x : set) unique[i++] = x;</p>
<p>// 步骤3:若需复制到另一个已有数组(比如 dst),才用 arraycopy
int[] dst = new int[unique.length];
System.arraycopy(unique, 0, dst, 0, unique.length); // 这里 copy 是冗余的,直接 unique 就行
</p></integer>
什么时候真需要 arraycopy?
常见于性能敏感场景,比如:
- 已有大数组,只想把去重后的部分复制到它的某一段(避免新建对象)
- 在原数组上“就地”去重后,用 arraycopy 收缩有效区域
- 配合 Arrays.sort + 双指针去重后,批量搬移保留元素
示例(原地去重 + arraycopy 收尾):
int[] arr = {1, 1, 2, 2, 3, 4, 4, 5};
Arrays.sort(arr); // 先排序:[1,1,2,2,3,4,4,5]
<p>int writeIndex = 0;
for (int readIndex = 0; readIndex </p><hr><h3>替代方案更简洁</h3><p>现代 Java 中,多数情况推荐更直观写法,无需手动 arraycopy:</p>
- Stream.distinct():`arr = Arrays.stream(arr).distinct().toArray();`
- Set 转数组:`int[] unique = set.stream().mapToInt(Integer::intValue).toArray();`
- 第三方库如 Guava:`Ints.asList(arr).stream().distinct().mapToInt(i -> i).toArray()`
除非明确需要零拷贝或复用缓冲区,否则不必强行套用 System.arraycopy。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











