在上一篇博客中,浅谈了 关于 java 中数组的创建,遍历,打印相关问题,这一篇想谈一谈 java 中 数组的拷贝 问题,C语言中数组是直接在内存上给相应变量一定大小的空间,对数组的赋值,改变是直接在内存层面操作的,但是在java中因为数组是一种引用类型,创建一个数组本质是创建了一个 相应类型的对象,对数组的操作也只是通过引用对对象中相应数据的改变。
C语言中要复制一个数组就先要创建另外一个数组,在通过对数组的遍历,依次将第一个数组每个元素赋值 到 第二个数组中,java中也可以这样操作。
public static void main(String[] args) {
int[] a = new int[] {
1, 2, 3, 4, 5, 6, 7};
int[] b = new int[7];
for (int i = 0; i < 7; ++i)
{
b[i] = a [i];
}
System.out.println("这是数组a: " + Arrays.toString(b));
System.out.println("这是数组b: " + Arrays.toString(a));
}
}
运行结果:
但是 在 java 中存在 这种情况 :
public static void main(String[] args) {
int[] a = new int[] {
1, 2, 3, 4, 5, 6, 7};
int[] b = a;
System.out.println("这是数组a: " + Arrays.toString(b));
System.out.println("这是数组b: " + Arrays.toString(a));
}
}
运行结果如下:
那么这真的是完成了一个数组的拷贝吗? 从运行结果来看 貌似 是这样,再来看下面这段代码:
public static void main(String[] args) {
int[] a = new int[] {
1, 2, 3, 4, 5, 6, 7};
int[] b = a;
System.out.println("这是数组a: " + Arrays.toString(b));
System.out.println("这是数组b: " + Arrays.toString(a));
//改变数组b的第一个元素
b[0] = 10;
System.out.println("这是貌似没动过的数组a: " + Arrays.toString(a));
System.out.println("改变后的数组b: " + Arrays.toString(b));
}
}
它的运行结果:
从代码中我们可以看到 ,改变的 是数组b的第一个元素的值,但是从输出结果来看数组a中第一个元素的值也被改变了,这是为什么呢? 你可以先思考一下再往下看。
要讲清楚这个问题就不得不稍微讲一下 java中创建一个 数组 背后 实际进行了哪些操作 。
public static void main(String[] args) {
int[] a = new int[] {
1, 2, 3, 4, 5, 6, 7};
int[] b = a;
}
这段代码实际是这样的
这就不难理解为是么执行 b[0] = 10 ; 这步操作时,为什么a[0] 也会等于10 了。
所以想要复制一个数组 不能 直接int[] b = a;
在Arrays 类中 有方法
static type copyOf(type[ ],int length)
这可以将一个数组的值拷贝到一个新的数组中去,length为要拷贝原数组的长度,可以小于原数组长度,此时要多长就拷贝多长,剩下的会自动截断;可以大于原数组长度,多余的会自动赋默认初始值(如果不知道赋什么初始值可以看我上一篇博客中有提到);当然也可以等于原数组长度。
具体实现如下:
public static void main(String[] args) {
int[] a = new int[] {
1, 2, 3, 4, 5, 6, 7};
//新数组长度等于原数组长度
int[] b = Arrays.copyOf(a,a.length);
//新数组长度小于原数组长度,截断
int[] c = Arrays.copyOf(a,3);
//新数组长度大于原数组长度,多余的元素自动赋初始值
int[] d = Arrays.copyOf(a,10);
System.out.println("这是数组b: " + Arrays.toString(b));
System.out.println("这是数组c: " + Arrays.toString(c));
System.out.println("这是数组d: " + Arrays.toString(d));
//改变数组b的第一个元素
b[0] = 10;
System.out.println("这是貌似没动过的数组a: " + Arrays.toString(a));
System.out.println("改变后的数组b: " + Arrays.toString(b));
}
运行结果如下:
可以看出 这种 拷贝 是创建了新的对象,执行 b[0] = 10 ; 并不会影响到原数组a[0]的值。
Arrays类中还有 一个 方法
static type copyOfRange(type[ ] a, int strat, int end)
该方法的含义是返回与类型a相同的一个数组,其长度是end-start。
小结:
java中真正拷贝一个数组的方式可以说有三种
1.通过遍历数组,依次赋值,最终拷贝一个数组。
2.运用static type copyOf(type[ ],int length) 方法。
3.运用static type copyOfRange(type[ ] a, int strat, int end) 方法。
针对初学者的总结,大佬勿喷,如果有错误还望海涵,最好在告诉我嘻嘻。