在处理某些数组问题时,总会遇到需要使用一个与目标数组同等空间的数组,或需要对其进行复制。
但在java当中,数组的变量名代表的仅仅是其在内存中的物理地址而不是其数组内容。
//初始化数组
int [] nums1 = new int[]{1,2,3,4,5,6,7};
int [] nums2 = new int[nums1.length]; //创建一个与nums1等同空间的数组以便复制;
nums2 = nums1;
若仅用变量名赋值会导致nums2的地址指向了nums1的地址, 而原先nums2的数组仍然为刚创立时的空数组,而这并不能达到我们预想的那样,故数组的复制还需使用其他方法。
1、一维数组复制
方法1:简单的for或增强for循环赋值,不再描述。
方法2:clone拷贝:
public static void main(String[] args) {
int[] nums1 = new int[]{1,2,3,4,5,6};
int[] nums2 = new int[nums1.length];
nums2=nums1.clone();
}
复制后 nums2与nums1内容相同,但地址指向不同;
方法3: System.arraycopy:
System.arraycopy(Object src,int srcPos, Object dest,int destPos ,int length)
src : 源数组
srcPos:源数组的开始位置 0 开始拷贝的位置
dest:拷贝到目标数组
destPos:拷贝到目标数组的位置
length:需要复制的长度
public static void main(String[] args) {
int[] nums1 = new int[]{1,2,3,4,5,6};
int[] nums2 = new int[nums1.length];
System.arraycopy(nums1,0,nums2,0,nums1.length);
System.out.println(nums1.equals(nums2)); //不同地址
System.out.println(Arrays.toString(nums2)); //数组元素相同
}
方法4:Arrays.copyof
Arrays.copyOf(array, int newLength);
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
public static void main(String[] args) {
int[] nums1 = new int[]{1,2,3,4,5,6};
int[] nums2 = new int[nums1.length];
nums2 = Arrays.copyOf(nums1,nums1.length);
System.out.println(nums1.equals(nums2));
System.out.println(Arrays.toString(nums2));
}
2、二维数组复制方法
方法1:双重for循环
不再描述
方法2:clone()
int[][] nums1 = new int[][]{{1,2,3},{2,3,4},{4,5,6}};
int m = nums1.length;
int n = nums1[0].length;
int[][] nums2 = new int[m][n];
nums2 = nums1.clone();
若使用如上方法,虽然nums2的地址与nums1的地址不同,但是num2中的数组地址与nums1中的数组地址相同,即变动nums2中的元素时nums1中的元素也会随之变动。
这是因为二维数组的原理是 :一个一维数组中,存着多个别的一位数组的地址。
故直接clone,只会将数组内的二层数组地址进行复制。
为了避免此结果,则应该
int[][] nums1 = new int[][]{{1,2,3},{2,3,4},{4,5,6}};
int m = nums1.length;
int n = nums1[0].length;
int[][] nums2 = new int[m][n];
for(int i = 0 ;i<m;i++)
nums2[i] = nums1[i].clone(); //进行逐层的clone就可以避免上述问题。
方法3:Arrays.copyOf与 System.arraycopy
与方法二一样,若直接进行复制则只是浅拷贝,
需要逐层复制才能达到深拷贝的效果。
//copyOf
int[][] nums1 = new int[][]{{1,2,3},{2,3,4},{4,5,6}};
int m = nums1.length;
int n = nums1[0].length;
int[][] nums2 = new int[m][n];
for(int i = 0 ;i<m;i++)
nums2[i] = Arrays.copyOf(nums1[i],nums1[i].length);
//System.arraycopy
for(int i = 0 ;i<m;i++)
System.arraycopy(nums1[i],0,nums2[i],0,nums1[i].length);