本想起 一个 0 引发的血案
,本着无事不调侃的性取向,索性改为一个馒头引发的血案。
越来越觉得在 Java 中,包装类型的产生完全是由于与其对应的基本类型无法表达"没有设置该值"、"该值无效"等语境。
以基本类型作为类的成员变量,都有默认值的概念。
基本类型 | 默认值 | 取值范围 | 大小 |
---|---|---|---|
byte | 0 | [-2^7, 2^7-1] | 8 |
short | 0 | [-2^15, 2^15-1] | 16 |
int | 0 | [-2^31, 2^31-1] | 32 |
long | 0 | [-2^63, 2^63-1] | 64 |
float | 0.0 | [1.4E-45,3.4028235E38] | 32 |
double | 0.0 | [4.9E-324,1.7976931348623157E308] | 64 |
char | \u00000 | [0, 2^16-1] | 16 |
boolean | false | [true,false] | 8 |
对于一个基本类型,你甚至无法区分默认值是"无效的",还是用户指定的有意义的。所以才出现了引用类型的 null。
而对于基本类型,想要表达这种"无效的"语义,你就得使用多使用一个二进制位用来区分,如二进制1:有效的;二进制0:无效的。
对于 8 个基本类型的数据需要额外存储一个 byte。
对于 16 个基本类型的数据需要额外存储一个 short。
等等。
这就是 Thrift 序列化中 __isset_bitfield
存在的意义。
超过 64 个基本类型属性就需要 BitSet 了。