Wapper类的拆包与自动装配与一个类的占用空间

java中数据类型一般分为基本类型,引用类型(数组属于引用类型)。基本类型是为了方便JVM快速的进行运算,是存放在JVM的栈之中。引用类型也存在栈中,但是引用的对象是存放在堆上面。包装类可以将基本类型当做类来处理。Integer,Boolean,Double,Character,Float,Byte,Short,Long,Void为对应基本类型的包装类。

        Integer i1 = 127;
        Integer i2 = 127;
        System.out.println(i1 == i2);

        Integer i3 = 128;
        Integer i4 = 128;
        System.out.println(i3 == i4);

运行结果为:
true
false
第一个很好理解,int类型自动装配成Integer,但是第二个为什么会输出false呢。因为在这里完成了一个new的操作。==是比较两个对象引用是否为一个对象。但是这里为什么要new一个Integer对象呢。因为在基本类型有一个字节的缓存,在这个范围内的值是存放在常量池(存放在数据运行空间的PermGen里)如果这个数据是在-128~127之间,char对象为0~127。,直接从常量池里取出即可。否则new一个对象。

Integer i1 = 128;
//等价于
Integer i2 = new Integer(128); 

基本类型放在栈上面主要是为了提高运行速度,因为基本类型的大小是固定的。

类型 大小(byte)
byte 1
short 2
char 2
int 4
float 4
double 8
long 8
boolean 1bit

一个对象的引用为4byte,一个空对象在堆上的大小为8byte
例如:

class NewObject //8 {
int count;      //4
boolean flag; //1
Object ob; //4
}

所占用空间为:8 + 4 + 1 + 4 = 17。又因为jvm的存储都是8byte的整数倍,因此占用空间为24byte。

你可能感兴趣的:(java,jvm,Class)