复习一些Java基础,填补自己的知识漏洞。
1.值引用和地址引用
(1)值引用
由下面程序:定义两个变量n1和n2,将n1的值的值赋给n2,然后修改n2的值,但n1不受影响,因为n1和n2之间只是值引用。
(2)地址引用
定义两个数组arr1和arr2,把arr1赋值给arr2,修改arr2,arr1的值也会改变,arr2在内存空间中指向一个地址,但int []arr2=arr1这条程序把arr2的指向修改了,arr2指向arr1的地址,所以当arr2修改的时候,arr1也会改变,因为它们指向的是同一块地址。
2.数组的拷贝
这里和上一点是异曲同工之妙,假设我们想把一个数组的值拷贝给另一个数组,我们会怎么做。
错误做法:
假如我们像下图一样,直接把第一个数组赋值给第二个数组,这样做就是地址引用,这样修改第二个数组的值时,则第一个数组的值也会改变。
正确做法:
利用值引用而并非地址引用
3.数组的扩容、缩减
(1)扩容
当我们定义了一个数组后无法改变长度,但我们可以利用地址引用,先定义一个新的数组,把新数组的长度定义成所需长度,把原来数组的值拷贝过去,然后利用地址引用把原来数组的地址指向新的地址。
(2)缩减
和上面扩容一样,同理可得。
4.二维数组的内存储存
假如定义一个二维数组int[2][3] arr ,那么它在内存当中大概是这样储存的,假设arr在堆中会指向一个地址0x0011,然后0x0011会指向堆中的一块空间,这块空间储存的是0x0022、0x0033两个地址,而0x0022和0x0033则分别指向一维数组arr[0]和arr[1],0x0022和0x0033才是储存具体数据的地方。