在Java基本数据类型有8中,boolean、byte、short、int、long、char、float、double。每一种数据类型都有与其对应的对象类
- 1、首先先说明一下基本数据类型占用的字节数。如下:
简单类型 | boolean | byte | char | short | int | long | float | double | void |
---|---|---|---|---|---|---|---|---|---|
占位数(1个字节8位) | 1 | 8 | 16 | 16 | 32 | 64 | 32 | 64 | |
封装类 | Boolean | Byte | Character | Short | Int | Long | Float | Double | Void |
上述是和虚拟机位数无关的,其中double和long型,在运算时是拆成两个32位进行运算的,所以在多线程情况下无法保证原子性。
* 2、介绍一下拆箱和装箱的问题。Java中拆箱和装箱是在基本数据类型和其对应的对象类之间转换时出现的,定义如下:
装箱: 把基本类型用它们相应的引用类型包装起来,使其具有对象的性质
拆箱:和装箱相反,将引用类型的对象简化成值类型的数据。
如:Integer i=100;JDK5以后的虚拟机会自动的调用Integer.valueOf(100) 将其转换成Integer对象,代码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
从代码可以看出在转换之前先判断转换的值是否在-128-127之间,如果是检查了缓存里是否存在,存在的话直接返回存在值的引用,不存在会新建一个。如果不在-128-127之间,则会直接新建一个Integer对象。
通过上边的描述,大家可能会觉得有一个问题,先看如下代码:
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
那么返回结果是什么呢?答案是第一个true、第二个false。其实通过上边装箱过程的描述,大家也会理解这个问题,f1是直接创建了一个,创建f2时,先检查内存是否有值等于100的,结果是有,于是直接将f2指向内存中为100的,所以f1、f2是指向的同一个内存,进行等号判断时,由于是引用类型,所以会比较引用是否相同,f3、f4其实是直接创建了两个新的对象,所以引用肯定不同。
- 3.下边总结一下在装箱时直接从内存返回引用的情况
类型 | 表示范围 | 直接从内存返回引用 |
---|---|---|
Integer | [−231,231−1] | [-128,127] |
Byte | [-128,127] | [-128,127] |
Short | [−215,215−1] | [-128,127] |
Char | [0,216−1] | [0,127] |
Long | [-2^{63},2^{63}-1] | [-128,127] |
Float | 32位 | 不存在从内存返回的,都是直接新建 |
Double | 64位 | 不存在从内存返回,都是直接新建 |