1. 数据类型

基本数据类型: byte,short,int,long,double,float,boolean,char

包装类型: Byte,Short,Integer,Long,Double,Float,Boolean,Character

这 8 种基本数据类型的默认值以及所占空间的大小如下:

基本类型

位数

字节

默认值

取值范围

​byte​

8

1

0

-128 ~ 127

​short​

16

2

0

-32768(-2^15) ~ 32767(2^15 - 1)

​int​

32

4

0

-2147483648 ~ 2147483647

​long​

64

8

0L

-9223372036854775808(-2^63) ~ 9223372036854775807(2^63 -1)

​char​

16

2

'u0000'

0 ~ 65535(2^16 - 1)

​float​

32

4

0f

1.4E-45 ~ 3.4028235E38

​double​

64

8

0d

4.9E-324 ~ 1.7976931348623157E308

​boolean​

1

false

true、false

包装类型的缓存机制

java的基本数据类型的包装类型大部分都是用了缓存机制

  1. ​Byte​,Short​,Integer​,Long​ 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character​ 创建了数值在 [0,127] 范围的缓存数据,Boolean​ 直接返回 True​ or False​。

  2. 如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

  3. 两种浮点数类型的包装类 Float​,Double​ 并没有实现缓存机制。

  4. 所有整型包装类对象之间值的比较,全部使用 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(发生循环)
...