目录
1、拷贝
1.1相关概念
当我们想使用某一对象的属性时,可以对其进行拷贝,这样就免去了创建一个新对象的过程。这种拷贝的方法叫做引用拷贝,也是我们在java中最基础的拷贝使用。引用拷贝也就是我们常用的对象赋值,这种方式不会生成新的对象,只会在原对象上增加了一个新的对象引用,两个引用指向的对象还是是同一个。
public class TestDemo { public static void main(String[] args) { int[] array={1,2,3,4}; int[] copy=array; System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(copy)); copy[0]=999; System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(copy)); } }
运行结果:
1.2常见拷贝方法
for循环实现
public static int[] copyArray(int[] array) { int[] copy = new int[array.length]; for (int i = 0; i < array.length; i++) { copy[i] = array[i]; } return copy; } public static void main(String[] args) { int[] array = {1,2,3,4,5,6}; int[] ret = copyArray(array); System.out.println(Arrays.toString(ret)); }
clone():
此方法是类 Object 中的方法,可以创建一个有单独内存空间的对象。因为数组也是一个 Object 类,因此也可以使用数组对象的 clone() 方法来复制数组。clone() 方法的返回值是 Object 类型,要使用强制类型转换为适当的类型
int[] array = {1, 2, 3, 4, 5, 6}; int[] copy = array.clone(); System.out.println(Arrays.toString(copy))
arraycopy():
第一个array表示原数组;第一个0 表示原数组中的起始索引;copy 表示目标数组;第二个0表示目标数组中的起始索引;array.length 表示要复制的数组长度。
int[] array = {1,2,3,4,5,6}; int[] copy = new int[array.length]; System.arraycopy(array,0,copy,0,array.length); System.out.println(Arrays.toString(copy));
copyOf():
复制数组至指定长度
其中,array 表示要进行复制的数组,array.length 表示复制后的新数组的长度。
int[] array = {1,2,3,4,5,6}; int[] ret = Arrays.copyOf(array,array.length); System.out.println(Arrays.toString(ret));
copyOfRange() :
则将指定数组的指定长度复制到一个新数组中。
array 表示原数组,1起始位置,4结束位置。
int[] array= {1,2,3,4,5,6}; int[] copy= {7,8,9}; copy=Arrays.copyOfRange(array, 1,4); System.out.println(Arrays.toString(copy));
以上几种方法都是浅拷贝(浅复制)。浅拷贝只是拷贝了对象的引用地址,两个内存地址指向同一个对象,所以修改其中任意的值,另一个值都会随之变化。深拷贝是将对象及值拷贝过来,两个对象修改其中任意的值另一个值不受影响。在拷贝中,区间为左开右闭。
2、深拷贝与浅拷贝
2.1浅拷贝:
对于基本数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值也随之改变。
2.2深拷贝:对于基本数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。
3、二维数组
3.1规则的二维数组:
int[][] array = {{1,2,3},{4,5,6}}; int[][] array2 = new int[][]{{1,2,3},{4,5,6}}; int[][] array3 = new int[2][3];
3.2 不规则的二维数组:
int[][] array2 = new int[2][]; array2[0]=new int[3]; array2[1]=new int[2];
3.3二维数组的输出:
public static void main(String[] args) { int[][] array = {{1,2,3},{4,5,6}}; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.print(array[i][j] + " "); } System.out.println(); } } }
over