商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java 数组拷贝技术:利用 Arrays.copyOf 实现多态数据类型的拷贝实战

Java 数组拷贝技术:利用 Arrays.copyOf 实现多态数据类型的拷贝实战

  发布于2026-07-05 阅读(0)

扫一扫,手机访问

先做个精炼总结:Arrays.copyOf 靠泛型和重载覆盖所有数组类型,底层统一调用 System.arraycopy 实现高效浅拷贝。基本类型走对应重载,引用类型走泛型版本,返回正确类型的数组。扩容时自动填默认值,源数组为 null 则抛出 NPE。就这么简单,但用起来有几个容易踩的坑,下面展开聊聊。

Ja va 数组拷贝技术:利用 Arrays.copyOf 实现多态数据类型的拷贝实战

说到拷贝数组,Arrays.copyOf 几乎是最省事的方案——不管你是 int[]String[] 还是自定义对象数组,它都能一把搞定。它不关心具体类型,只认源数组和目标长度,多态支持全靠泛型和重载托底,实际拷贝过程跟数据类型无关。

支持所有数组类型,无需手动区分

Arrays.copyOf 为每种基本类型(int、double、boolean 等)都准备了重载方法,引用类型则单独配了一个泛型版本。JVM 根据实参类型自动选人,开发者不用写 if 判断,更不用手动做类型转换。

  • 基本类型数组:直接走对应重载,比如 Arrays.copyOf(int[], int)
  • 引用类型数组:走泛型方法 Arrays.copyOf(T[], int),编译器自动推断类型,运行时保留组件类型
  • 重点:泛型版本返回的是 T[],不是 Object[],省得你事后强转

拷贝逻辑统一:底层调用 System.arraycopy

所有重载版本最终都委托给 native 方法 System.arraycopy,效率高、语义一致——浅拷贝、连续内存复制、越界检查全交给 JVM 兜底。

  • 新数组长度大于原数组?多余位置自动填默认值(int 填 0,引用类型填 null)
  • 新数组长度小于原数组?只复制前 N 个元素,不会抛异常
  • 源数组为 null?直接扔 NullPointerException,调用方必须自己判空

实战中避开常见陷阱

方法本身不复杂,但类型擦除、泛型边界和子类数组场景容易出幺蛾子。

  • 别用 Object[] 接收子类数组再拷贝——运行时类型信息一丢,后面就麻烦了。直接拿泛型方法操作原始数组更靠谱
  • 拷贝 String[]Integer[] 这些不可变类型完全没问题;但拷贝自定义对象数组时,只是复制了引用,对象本身不会深拷贝
  • 需要扩容同时保留原有内容?直接写 Arrays.copyOf(arr, arr.length + 10) 就行,比先 newSystem.arraycopy 简洁多了

结合泛型工具方法提升复用性

还可以封装一层来适配不同场景,比如加个安全判空或者默认值填充。

  • 示例:public static T[] safeCopy(T[] src, int newLength) { return src == null ? (T[]) new Object[newLength] : Arrays.copyOf(src, newLength); }
  • 基本类型数组还是建议直接用原生重载——避免装箱拆箱带来的额外开销
  • 泛型方法里不能直接 new T[newLength](类型擦除记得吧),必须靠反射或借用 Object[] 转型。Arrays.copyOf 内部正是这么处理的
本文转载于:https://www.php.cn/faq/2742805.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注