为什么这样子无法成功将数据备份,具体问题是什么,应该怎样才能成功的将数据备份
你的意思是在data修改后, backups是刚赋值的那样的意思吗?
因为你直接 backups = data 这么赋值的, 所以这两个变量指向的都是同一个对象, 你直接打印数组, 地址值应该是一样的, 这样也就导致你修改data[0],但是backups指向的也是这个数组, 再打印数据就是被修改的;
要备份那就将原数组copy一个新数组, 说白了就是这俩变量指向的不是同一个数组就行了
public static void main(String[] args) {
final char[] data = {'1','2'};
char[] same = data;
final char[] back = Arrays.copyOf(data, data.length);
System.out.println("data = " + data);
System.out.println("same = " + same);
System.out.println("back = " + back);
System.out.println("data = " + Arrays.toString(data));
System.out.println("back = " + Arrays.toString(back));
data[0] = '3';
System.out.println("data = " + Arrays.toString(data));
System.out.println("back = " + Arrays.toString(back));
}
#prints out
data = [C@4b1210ee
#直接赋值, same指向的数组对象和data是同一个
same = [C@4b1210ee
back = [C@4d7e1886
data = [1, 2]
back = [1, 2]
data = [3, 2]
back = [1, 2]
java引用类型变量在栈中 指向堆内存中的对象,当你用 backups=data 时
相当于backups引用变量指向了堆内存中的data数组对象
所以你的方法无法实现复制
正确的操作:
Arrays 类的 copyOf() 方法
Arrays 类的 copyOfRange() 方法
System 类的 arraycopy() 方法
Object 类的 clone() 方法**
a.使用 copyOf() 方法和 copyOfRange() 方法:
Arrays 类的 copyOf() 方法与 copyOfRange() 方法都可实现对数组的复制。
copyOf() 方法是复制数组至指定长度
copyOfRange() 方法则将指定数组的指定长度复制到一个新数组中
其中copyof()方法底层是利用System.arraycopy()来实现的。
1. 使用 copyOf() 方法对数组进行复制
Arrays 类的 copyOf() 方法的语法格式如下:
Arrays.copyOf(dataType[] srcArray,int length);
其中,srcArray 表示要进行复制的数组,length 表示复制后的新数组的长度。
使用这种方法复制数组时,默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。
注意:目标数组如果已经存在,将会被重构。
2. 使用 CopyOfRange() 方法对数组进行复制
Arrays 类的 CopyOfRange() 方法是另一种复制数组的方法,其语法形式如下:
Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
其中:
1.srcArray 表示原数组。
2.startIndex 表示开始复制的起始索引,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间。
3.endIndex 表示终止索引,目标数组中将不包含终止索引对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充。
注意:目标数组如果已经存在,将会被重构。
b.使用 arraycopy() 方法
arraycopy() 方法位于 java.lang.System 类中,其语法形式如下:
System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)
其中,srcArray 表示原数组;srcIndex 表示原数组中的起始索引;destArray 表示目标数组;destIndex 表示目标数组中的起始索引;length 表示要复制的数组长度。
使用此方法复制数组时,length+srcIndex 必须小于等于 srcArray.length,同时 length+destIndex 必须小于等于 destArray.length。
注意:目标数组必须已经存在,且不会被重构,相当于替换目标数组中的部分元素。
c.使用 clone() 方法
clone() 方法也可以实现复制数组。该方法是类 Object 中的方法,可以创建一个有单独内存空间的对象。因为数组也是一个 Object 类,因此也可以使用数组对象的 clone() 方法来复制数组。
clone() 方法的返回值是 Object 类型,要使用强制类型转换为适当的类型。其语法形式比较简单:
array_name.clone()
int[] targetArray=(int[])sourceArray.clone();
数组不能直接变量赋值。要遍历数组,一个一个赋值。具体原因其他人也解释了。