> 文档中心 > (JAVA):“值拷贝”和“引用赋值”易错易混的地方。

(JAVA):“值拷贝”和“引用赋值”易错易混的地方。

目录

前言:

1、什么是值拷贝?

2、什么是引用赋值

3、例子:

(1)代码1:值拷贝

(2)代码2:引用赋值 

4、代码纠正: 


前言:

 打卡!打卡!

今天看到这个容易混淆的地方,在这之前我都不知道、没注意,今天补上,当个笔记。

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

        在开辟一个新的堆后,两个数组各自使用各自的堆,会不干扰,所以改变其中一个,另一个不会变了。