int[] arr = new int[10];int[] arr2 =arr;
arr[1] = 10;
arr2[1] = 20;
System.out.println(arr[1]);
上面这串代码的输出结果是20.
这个结果我要深入到java中数据类型和数据存储原理了。java中有八种基本数据类型,分别是整型四种byte、short、int、long,浮点型两种float、double,布尔型一种boolean,字符型一种char,总共八种。要注意我们平时常用的String类型并不属于基本数据类型,如过查看源代码我们就会发现String类型实质上就是字符数组.除了这八种基本数据类型外,其余的数据类型都属于引用型数据类型。在定义变量时,如果是基本数据类型,jvm会在栈中开辟一个数据空间存放基本数据,变量直接引用这个数据。但是在其他数据类型时,当使用new这个关键字后,java会在栈中和堆中同时进行操作,在栈中声明变量,同时在堆内存中开辟数据空间用于存放数据,同时把这个数据空间的起始地址赋给栈中的变量。也就是说,这个变量直接引用了这个数据空间的地址。知道这个原理后,再来分析上面这几行代码,就可以发现:
jvm首先在栈中声明了arr这个变量,并在堆中开辟了相应的空间大小,并把起始地址(我们假设是0x92)给arr,这样arr就记录了这块空间;
当我们声明第二个变量arr2时,同时把arr的值赋给arr2时,jvm在堆中并没用开辟新的空间,而是直接将arr指向的地址0x92给了arr2,这样就形成了arr和arr2同时指向堆中同一片数据空间的局面,这样我们我们无论是对arr还是arr2进行操作,操作的都是堆中同一片数据空间里的数据,自然就会互相影响。