一、实例展示

1. 实例一:同一个引用赋值的数组地址相同
  • 如果一个数组的引用被另外一个数组的引用赋值后,被引用赋值的数组和原数组共享一个地址。下面我们以一个测试来验证地址是否共享。
  • :这里的’引用‘指的是数组变量名,就是arr1、arr2、arr3
public class ArraysTest {
	    public static void main(String[] args) {
	        int[] arr1={1,2,3};
	        int[] arr2=arr1;
	        int[] arr3=arr2;
	        //最后三个数组是同一个引用,地址相同
	        System.out.println("arr1的地址:"+arr1);
	        System.out.println("arr2的地址:"+arr2);
	        System.out.println("arr3的地址:"+arr3);
	    }
arr1的地址:[I@1b6d3586
		arr2的地址:[I@1b6d3586
		arr3的地址:[I@1b6d3586

java变量赋值string java变量赋值地址相同吗_jvm

2.同一引用的数组共享数据内容
  • 其中多个数组被同一个引用赋值之后,那么这些数组中的一个数组对其的数据进行改变,那么这些数组的数据也就会都跟着改变。下面同样以测试来证明。
public class ArraysTest {
	    public static void main(String[] args) {
	        int[] arr1={1,2,3};
	        int[] arr2=arr1;
	        int[] arr3=arr2;
	        System.out.print("          arr1的数组内容:");
	        for (int i : arr1) {
	            System.out.print(i+",");
	        }
	        //现在改变数组arr3的内容,数组arr1的内容改变
	        arr3[0]=6;
	        arr3[1]=6;
	        arr3[2]=6;
	        System.out.print("\n修改arr3后arr1的打印情况:");
	        for (int i : arr1) {
	            System.out.print(i+",");
	        }
	    }
	}
arr1的数组内容:1,2,3,
	修改arr3后arr1的打印情况:6,6,6,

java变量赋值string java变量赋值地址相同吗_jvm_02

3.简单结论
  • 看到以上两个实际测试的结果后,我们可以得出简单的结论。数组之间使用引用进行赋值,那么这些数组是的地址相同,共享一块内存区域
  • 下面,我们用简单的原理图来稍加说明,让我们更深层次的理解数组之间的引用赋值到底是怎么一回事。

二、原理分析

1.地址指向分析
  • 在实例一中,我们可以看到3个数组的地址是相同的,那么里面的内存区域到底是怎样的,下面这幅图简单的表示了一下。
  • 过程:首先arr1最先定义,得到了内存区,地址就是[I@1b6d3586;紧接着,arr2数组被arr1这个引用赋值了,得到了地址[I@1b6d3586;那么同样的,接着arr3被arr2赋值了,于是得到了同样的地址[I@1b6d3586。那么,下图中的情况就明白了,3个数组指向了同一个地址,使用了同一块内存区。

java变量赋值string java变量赋值地址相同吗_java变量赋值string_03

2.共享数据内容分析
  • 在实例二中,3个数组中,只要其中一个数组的内容改变,那么其他的两个数组的内容也会发生相应的变化。其实原因很简单,就是因为他们共享了同一块内存区域,正如实例一中所示,3个数组的地址是相同的。
  • 过程:开始的时候,三个数组的内容都是最原始的内容1,2,3;接着,arr3发生动作,对自己的内容进行了改变,但是,由于三个数组共享一块内存区域,那么这三个数组的内容都变为了数组arr3修改之后的内容

java变量赋值string java变量赋值地址相同吗_jvm_04

java变量赋值string java变量赋值地址相同吗_jvm_05

三、小总结

  1. 在这里,我们知道了数组的引用赋值使得数组都指向了同一块内存区域,他们共享这块内存区域的数据,并不是新创建出一块内存区域单独存储。
  2. 这里需要注意,我们这里所说的是引用赋值不是新创建数组,如果是新创建数组,那么是会新开辟内存空间的。这里小伙伴们需要注意区分。
  3. 最后做一点拓展:数组的数据类型在Java中是引用数据类型,像Java中的对象也是引用数据类型。所以对于像对象这些引用类型的数据的引用赋值是和数组的引用赋值是一个道理。