我们在这拿一个一维数组举例子
int[] a=new int[3]
a数组的地址引用存放在栈中,指向堆中a数组的首个值。
因为是数组,所以数组中各个值在堆中的存储空间是连续的。
这里注意:
在内存中,操作系统将内存划分为多个空间,这里每个空间为4K(4096字节)。
为什么是4K呢?
因为这个空间中只要存了数据,那么下次存放数据会存放到下一个空间。(比如a[0]和a[1]存储的便不是同一个空间)
如果这个空间过大,而我往往存的东西没那么多,便会浪费空间。
如果这个空间过小,那么内存划分的空间数便会过多,每个空间又要分配一个地址,因此就要分配很多地址。而地址在内存中有专门的地方存储,如果地址过多,也会浪费空间。
所以我们采取了折衷的方法,取了4K。
为什么这个空间中只要存了数据,那么下次存放数据会存放到下一个空间?
如果放在当前空间,无法获取新数据首地址
你说地址存储不会占用很多空间?
那我们来看看每个地址占多少个字节
若内存为8G,空间划分为每个空间1K,那么用8G的字节除以1K的字节,一共要划分800w个左右的空间,那么便要分配800w个左右的地址。那么每个地址要5个字节才能存储这么多的地址。那么一共需要 5*800w 字节存储地址。这个空间占用的还不够多吗