Java 数组存储压缩原理,以及原因

数组在存储时的压缩原理以及原因

这篇博客,都是以byte类型的数组为例子

数组是一个物理空间连续的结构,对于数组,内存只记住开头的地址,记全部对内存损耗大

在我们电脑内存里面,一般的话,内存单元都是占 4KB的大小,但是我们的 byte类型的大小为1B,也即是说,当我们命名一个数组时。如

byte[] arr = new byte[1024];
压缩数组的原因:为了节省内存

对于上述数组,如果一个数组单元内用一个内存单元的话,则每一个内存单元都浪费了4KB - 1B的内存空间,所以,为了节省空间,我们对数组的存储进行了压缩,即由于一个内存单元的大小为4KB,而byte类型的数组的大小一个单位为1B,所以压缩后,我们可以将这些数组放入一个内存单元里面,而这么一个内存单元刚好可以放 4KB / 1B = 1K =4 * 1024个,这样,原本该数组要使用4 * 1024个内存单元,经过压缩后,就变成了只需要一个内存单元了,这样大大的节省了内存空间

数组压缩的形式原理,以及怎么取值
//继续引用上述的数组,对该数组赋值
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;
arr[5] = 5;
// 后续的赋值省略

当这个数组存储时,在计算机里面,都是以二进制形式存储

即上述数组的值全都转化为二进制了

arr[0] = 0b00000000;
arr[1] = 0b00000001;
arr[2] = 0b00000010;
arr[3] = 0b00000011;
arr[4] = 0b00000100;
arr[5] = 0b00000101;
// ...后面省略

当储存时, 内部会将他们整合到一起即

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1|-----arr[0]----||-----arr[0]----||-----arr[0]----||-----arr[0]----||-----arr[0]----||-----arr[0]----|

我们可以看到i,这种存储形式将他们整合到了一起,即看起来,他们就像是一个数,当我们要取arr[2]时,计算机看到你是byte类型时,哦是byte啊,所以它就开始找,一个byte占一个字节8位,所以你要取arr[2],他就找从 第8 * 2 + 1 到8 * 3之间的数(假设第一个为第一个,而不是第零个),这样就取到了 00000010 即 arr[2] = 2 这个值,这就是压缩后的取值

所以值类型的数组的存储时,都是以压缩的形式存储的,这样可以节省内存,但是引用类型的数组就不可以这样存储

为什么引用类型数组存储时不压缩存储

向上面的byte类型,因为其占内存大小是固定的,即一个字节,以及所有的Java的八种基本类型的大小,都是固定的,所以都可以以压缩i的形式存储,但是值类型或者说非基本类型,因为占用内存的大小不是固定的,所以在压缩后,无法固定的取值,向byte,因为占八位,每次都,都是以一个有规律的方式去取值,所以能取到,但是不固定大小的值要取值时,因为大小不固定,所以没有固定的规律来取值,所以无法取值,这样,就无法进行压缩存储,只能老老实实的按原来的方式存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值