数组的拷贝分为浅拷贝和深拷贝,浅拷贝指的是在拷贝时,如果是引用类型如对象,只是拷贝数组的内存地址,而非数组的实际值。因此,拷贝后修改数组中的值,原数组的值也会随之改变,因为它们指向的是同一个内存地址。
而深拷贝实际上是在内存中开辟一个新的空间,拷贝数组中的每一个值。在改变拷贝数组中的值时,不会影响原始数组中的值,因为原始数组和拷贝数组分别指向两个不同的内存地址。
在Java中,想要实现对数组的浅拷贝有以下五种方法:
for循环拷贝
int[] arr = {1,2,3,4,5,6};
int[] arr1 = new int[arr.length];
for(int i = 0; i < arr.length; i++) {
arr1[i] = arr[i];
}
2. .clone拷贝
int[] arr = {1,2,3,4,5,6};
int[] arr1 = arr.clone();
直接拷贝成一个与arr相同长度,相同元素的新数组arr1。
3.System.arraycopy拷贝
int[] arr = {1,2,3,4,5,6};
int[] arr1 = new int[arr.length];
System.arraycopy(arr, 0, arr1, 0, arr.length);
该方法位于 java.lang.System 类中,语法格式如下:
System.arraycopy(dataType[] srcArray,int srcIndex, dataType[] destArray,int destIndex,int length)
dataType[] srcArray:要拷贝的数组
int srcIndex:原始数组拷贝起始位
dataType[] destArray:拷贝的新数组
int destIndex:新数组起始位
int length:要拷贝的数组长度
4.Arrays.copyOf拷贝
int[] arr = {1,2,3,4,5,6};
int[] arr1 = Arrays.copyOf(arr, arr.length);
使用Arrays类的copyOf( )方法,语法格式如下:Arrays.copyOf (dataType[] srcArray,int length);
其中,dataType[] srcArray其实就是我们需要拷贝的数组,int length是要拷贝的数组长度
如果新数组length小于旧数组length,那么就只会拷贝到第length个元素,如果新length大于旧length,那么多出来的元素就会是默认值。
5.Arrays.copyOfRange拷贝
int[] arr = {1,2,3,4,5,6};
int[] arr1 = Arrays.copyOfRange(arr, 0, 6);
这是Arrays的另一种拷贝方法,可以用来拷贝指定的数组范围。书写格式为:
Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
dataType[] srcArray是我们要拷贝的数组
int startIndex是我们要拷贝的起始索引
int endIndex 是我们要拷贝的终止索引
但是需要注意的是,新的数组中不包含终止索引对应的元素,简而言之就是,如果起始索引写0,终止索引写6,那么将会拷贝数组下标0-5的元素。