目录
前言:
打卡!打卡!
今天看到这个容易混淆的地方,在这之前我都不知道、没注意,今天补上,当个笔记。
1、什么是值拷贝?
简单来说就是复制,把第一个变量的值复制给第二个变量,改变第二个变量的值不会影响第一个变量的值。
2、什么是引用赋值?
就是引用值,在堆中放有一堆数据,栈中的变量1和变量2去引用这个堆里的数据,改变任何一个变量的值,就是改变堆里的值,另一个变量的值也会随之而变。
3、例子:
(1)代码1:值拷贝
int n1 = 10; //初始化 int n2 = n1; //初始化 n2 = 80; //改变n2的值 System.out.println(n1); //结果为10 System.out.println(n2); //结果为80
我们可以看到上面代码,值拷贝只改变一个变量,另一个变量不会改变。
(2)代码2:引用赋值
int[] arr1 = { 1, 2, 3}; //数组初始化 int[] arr2 = arr1; //数组初始化 arr2[0] = 10; //改变第二个数组的第一个元素 System.out.println(arr1[0]); //结果为10 System.out.println(arr2[0]); //结果为10
为什么两个结果都改变了呢?因为数组赋值(arr2 = arr1)是赋的地址,把arr1的地址给了arr2,两个数组使用的是同一个堆中的数据,所以无论改变哪个数据,另一个也会改变。
那怎么使两个数组数据分开,互不干扰呢?前面说了,是因为使用了同一个堆,那我们再开辟一个堆出来不就解决问题了。
4、代码纠正:
int[] arr1 = { 1, 2, 3}; //赋初值 int[] arr2 = new int[arr1.length]; //开辟新的堆,然后再赋值 arr2[0] = 10; //改变其中一个值 System.out.println(arr1[0]); //结果为1 System.out.println(arr2[0]); //结果为10
在开辟一个新的堆后,两个数组各自使用各自的堆,会不干扰,所以改变其中一个,另一个不会变了。