拷贝方式
在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();
}
相关文章
关注千锋学习站小程序
随时随地免费学习课程
扫一扫快速进入
千锋移动端页面
扫码匿名提建议
直达CEO信箱