千锋教育-做有情怀、有良心、有品质的IT职业教育机构

400-811-9990
当前位置:首页  >  技术文章  >  正文

什么是数组拷贝?

时间:2023-03-23 17:37     来源:千锋教育 作者:qyf

什么是数组拷贝

  拷贝方式

  在Java中,数组的拷贝主要有三种实现方式:

  1.通过循环语句,将原数组中的各个元素拷贝到新数组中(即数组扩容案例中使用的方法);

  2.System类提供的数组拷贝方法;

  3.Arrays类提供的数组拷贝方法。

  System.arraycopy方法

  2.1 简介

  System.arraycopy()是Java提供的一个本地静态方法,用于将数据元素从源数组复制到目标数组。

  public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);

  arraycopy()方法有5个核心参数,其含义如下:

  ●src: 源数组,即被复制的旧数组;

  ●srcPos: 源数组中开始复制的索引位置;

  ●dest: 目标数组,即要复制到的新数组;

  ●destPos: 要复制到目标数组中的索引位置;

  ●length: 要复制的元素个数。

  另外我们还要注意,arraycopy()方法在有些情况下有可能会发生如下异常:

  ●NullPointerException: if source or destination array is null.NullPointerException :如果源或目标数组为null时,就会产生NullPointerException异常。

  ●ArrayStoreException: if the source and destination array type doesn’t match or they are not array.ArrayStoreException :如果源和目标数组类型不匹配或不是数组,会产生该异常;

  ●ArrayIndexOutOfBoundsException: if the data overflow occurs because of index values or they are negative.ArrayIndexOutOfBoundsException :如果由于索引值导致数据溢出,或它们为负数时会产生该异常。

  2.2 案例

  我们先来看看下面这个数组拷贝的案例:

  public class Demo07 {

  public static void main(String[] args) {

  // 数组拷贝

  //1.源数组

  int[] srcArr = {1,3,46,22,11};

  //2.目标数组

  int[] destArr = new int[srcArr.length + 5];

  /**

  * src:原数组

  * srcPos:原数组的起始拷贝位置

  * dest:目标数组

  * destPos:目标数组的起始拷贝位置

  * length:拷贝的长度

  */

  //3.调用arraycopy方法进行复制

  System.arraycopy(srcArr, 1, destArr, 3, 4);

  //对新数组进行遍历

  for (int i = 0; i < destArr.length; i++) {

  System.out.print(destArr[i]+"\t");

  }

  }

  }

  Arrays.copyOf方法

  3.1 简介

  Arrays.copyOf()可以复制数组中指定范围的元素。该方法会返回一个新的数组对象,且改变新数组中的元素值,不会影响原来的数组。我们还可以利用Arrays.toString方法将赋值后的数组输出。

  该方法支持的参数可以是long、float、double、int、boolean、byte、Object等类型的数组。

  public static int[] copyOf(int[] original, int newLength);

  copyOf()方法有2个核心参数,其含义如下:

  ●original: 源数组,即被复制的旧数组;

  ●newLength: 表示新数组的长度。如果新数组的长度超过源数组的长度,会采用数组元素类型的默认值。

  3.2 案例

  以下是Arrays.copyOf()方法的实现案例:

  public class Demo08 {

  public static void main(String[] args) {

  // 数组拷贝

  //1.源数组

  int[] srcArr = {1,3,46,22,11};

  /**

  * original:原数组

  * newLength:新数组的长度

  * 返回值:返回新数组

  */

  //2.调用copyOf方法进行数组拷贝

  int[] destArr = Arrays.copyOf(srcArr, srcArr.length+1);

  //3.遍历新数组

  for (int i = 0; i < srcArr.length; i++) {

  System.out.print(destArr[i]+"\t");

  }

  }

  }

  Java中如何拷贝自定义类组成的数组:

  在 Java 中,可以使用以下方法拷贝自定义类组成的数组:

  1.实现 Cloneable 接口并重写 clone() 方法:自定义类必须实现 Cloneable 接口,否则在调用 clone() 方法时会抛出 CloneNotSupportedException 异常。在 clone() 方法中,可以通过调用父类的 clone() 方法来创建一个新的对象,并将原始数组中的元素复制到新的数组中。

  例如:

  public class MyClass implements Cloneable {

  private int id;

  private String name;

  // 构造方法和其他方法省略

  @Override

  public MyClass clone() throws CloneNotSupportedException {

  MyClass cloned = (MyClass) super.clone();

  return cloned;

  }

  }

  然后可以使用 Arrays.copyOf() 方法或者手动复制数组的元素来实现数组的拷贝:

  MyClass[] arr1 = new MyClass[]{new MyClass(1, "A"), new MyClass(2, "B"), new MyClass(3, "C")};

  MyClass[] arr2 = Arrays.copyOf(arr1, arr1.length); // 使用 Arrays.copyOf() 方法

  MyClass[] arr3 = new MyClass[arr1.length]; // 手动复制数组的元素

  for (int i = 0; i < arr1.length; i++) {

  arr3[i] = arr1[i].clone();

  }

  2.使用序列化和反序列化:自定义类必须实现 Serializable 接口,否则在序列化或反序列化时会抛出 NotSerializableException 异常。可以将数组序列化成字节数组,然后再反序列化成新的数组。

  例如:

  public class MyClass implements Serializable {

  private int id;

  private String name;

  // 构造方法和其他方法省略

  }

  然后可以使用 ByteArrayOutputStream 和 ObjectInputStream/ObjectOutputStream 来实现序列化和反序列化:

  MyClass[] arr1 = new MyClass[]{new MyClass(1, "A"), new MyClass(2, "B"), new MyClass(3, "C")};

  byte[] bytes = null;

  MyClass[] arr2 = null;

  try (

  ByteArrayOutputStream bos = new ByteArrayOutputStream();

  ObjectOutputStream oos = new ObjectOutputStream(bos)

  ) {

  oos.writeObject(arr1);

  bytes = bos.toByteArray();

  } catch (IOException e) {

  e.printStackTrace();

  }

  try (

  ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

  ObjectInputStream ois = new ObjectInputStream(bis)

  ) {

  arr2 = (MyClass[]) ois.readObject();

  } catch (IOException | ClassNotFoundException e) {

  e.printStackTrace();

  }

相关文章

上一篇:return的作用有哪些
下一篇:
  • 北京总部地址:北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 深圳校区地址:深圳市宝安区宝安大道5010号西部硅谷B座A区6层A605/B座C区1层108
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 广州校区地址:广州市白云区永平街永泰学山塘学山文化创意谷A1栋六楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 郑州二七区校区地址:郑州市二七区航海中路60号海为科技园C区10层
    郑州高新区校区地址:郑州市高新区金梭路与银杏路交叉口教育科技产业园南门D座4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 武汉金融港校区地址:武汉市东新区光谷大道77号金融港B18栋三楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 成都校区地址:成都市高新区肖家河沿街138号肖家河大厦三楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 杭州旺田校区:浙江省杭州市江干区九堡旺田书画城A座4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 青岛校区地址:青岛市市北区龙城路31号卓越世纪中心4号楼5层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 重庆校区地址:重庆市九龙坡区科园一路3号渝高大厦9楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 哈尔滨校区地址:哈尔滨市松北区世泽路689号 科技创新城4号楼1101
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 南京校区地址:南京市建邺区应天大街780号弘辉产业园1栋2层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 太原校区地址:太原市小店区长治路230号能源互联网大厦6层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 沈阳校区地址:辽宁省沈阳市浑南区世纪路16号东大软件园B园B1座A201
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 合肥校区地址:合肥市包河区徽州大道396号东方广场B座12A
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 千锋教育服务号

    关注千锋学习站小程序
    随时随地免费学习课程

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱