对一维数组而言,仅不开辟空间的直接赋值为浅拷贝(brr=arr)
数组拷贝有5种方法
1.for
2.System.arraycopy(src,srcpos,dest,destpos,length)
3.Arrays.copyof( original, newlength)
4.clone()
5.Arrays.copyOfRange(original,from,to)
1.for循环遍历数组对元素一一进行赋值操作(对于多维数组来说是浅拷贝)
2.调用 System.arraycopy(src,srcpos,dest,destpos,length)//必须保证dest有足够容量;
int[] arr = {1,2,3,4,5,6};
int[] brr = new int[arr.length];
System.arraycopy(arr,1,brr,0,5);
System.out.println(Arrays.toString(brr)); //[2, 3, 4, 5, 6, 0]
3.调用Arrays.copyof( original, newlength);//original:原数组,newlength:开辟大小为新数组长度的空间
该函数调用Systrm.arrayscopy()
int[] arr = {1,2,3,4,5,6};
int[] brr = {1};
brr =Arrays.copyOf(arr,3);
System.out.println(Arrays.toString(brr)); //[1, 2, 3]
brr =Arrays.copyOf(arr,6);
System.out.println(Arrays.toString(brr)); //[1, 2, 3, 4, 5, 6]
由示例可以看到拷贝与dest的初始大小无关所以用该方法可以于给数组进行扩容 arr = Arrays.copyOf(arr,arr.length+3);
同样该方法也可以对数组进行缩容(如果删除元素没有缩容会打印出无效值)
arr = Arrays.copyOf(arr,arr.length-1);
但是该方法是在堆中重新开辟空间,所以必定会改变数组的首地址,所以在方法中对数组进行该操作主函数内不可以调用。
public static void main(String[] args) {
int[] arr = new int[]{1};
change(arr);
System.out.println(arr[0]); //输出1
}
public static void change(int[] arr){
arr = Arrays.copyOf(arr,arr.length+1);
arr[0] = 99999;
}
4.调用object.clone()//对于自己创建的类必须通过接口实现
int[] arr = {1,2,3,4,5,6};
int[] brr = arr.clone();
System.out.println(Arrays.toString(brr)); //[1,2, 3, 4, 5, 6, 0]
5.调用Arrays.copyOfRange(original,from,to)
int[] arr = {1,2,3,4,5,6};
int[] brr = Arrays.copyOfRange(arr,1,4);
System.out.println(Arrays.toString(brr));