—— 本文参照 Learn Java for Android Development (第三版)
不知道讲了变量以后大家会不会好奇这东西在计算机里面究竟是怎么存储的,作为我个人来说我真得至今没有去好奇这个东西,因为一开始老师都说了计算机里面的东西都是用0和1来表示的。但是几乎大部分的书里面都会去介绍变量的存储方式。前篇列举的变量的例子在计算机里面是用高位存储的方式来存储的(也就是平时说的小端模式),低位字节在前,高位在后。
上图分别列出了counter、ages、matrix这几个变量在计算机中的内存地址,counter的内存地址是20001000,ages的内存地址是20001004,matrix的内存地址是20001008。看这几个地址我们可以看出他们的地址都是可以被4整除的。其中counter的值就存在20001000这个地址里面,ages和matrix的值是分别存在他们的地址里面的。(注意这里32位的系统的存储跟64位的系统的存储也是有差别的,具体的差别可以自己百度看看java基础(变量的存储方式)还有就是一维数组存储的就是所有的数组的值,如果是二维数组的话,其实可以拆分成一个一个的一维数组,计算机存储的是每一个一维数组的地址。依次类推多维数组。
从上面我们可以看出来数组名即地址,实际上一个java申明其实也包含了一个句柄,因为java里面是没有指针的,所以这里我认为可以说成是句柄。句柄是什么个意思呢,看看下面的图:
使用句柄对于垃圾回收来说是非常方便的,如果变量都通过引用数组的地址来引用变量,那么当数组的地址变化的时候这些引用都需要更新一遍。但是如果使用句柄来访问变量,当数组变化时我们只需要更新句柄就好了。使用句柄的缺点就是访问变量的速度不如直接使用地址访问快。尽管参考文献里面也都提到了这些缺点,但是为了保证java的稳定性,在内部的实现上还是使用的句柄的方式。
(PS:这一篇的翻译我自己也不能完全明白java基础(变量的存储方式)
Page 47