
java基础知识
1. 数据类型
基本数据类型: byte,short,int,long,double,float,boolean,char
包装类型: Byte,Short,Integer,Long,Double,Float,Boolean,Character
这 8 种基本数据类型的默认值以及所占空间的大小如下:
包装类型的缓存机制
java的基本数据类型的包装类型大部分都是用了缓存机制
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
两种浮点数类型的包装类 Float,Double 并没有实现缓存机制。
所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
自动装箱和拆箱
装箱: 基本数据类型转换成包装数据类型
拆箱: 包装数据类型转换成基本数据类型
Integer i = 10; //装箱
int n = i; //拆箱
从字节码中,我们发现装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。
因此,
Integer i = 10 等价于 Integer i = Integer.valueOf(10)
int n = i 等价于 int n = i.intValue()
为什么浮点运算会有精度丢失
这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。
就比如说十进制下的 0.2 就没办法精确转换成二进制小数:
// 0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,
// 在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0(发生循环)
...