自动装箱:Integer.valueOf()
自动拆箱:integer.IntValue()
两个过程都发生在编译阶段,javac为我们完成这些工作。PS:在Int的值在-128到127之间的时候,会产生缓存机制,值会被放进常量池。也就是方法区(Boolean,Short,Byte,Character也有这种机制。其中Byte因为数值有限,都会被放进方法区)。
引用类型相比于原始类型的优势在与缓存机制。
同时在包装类里储存数值的成员变量value也是被声明为“private final”,所以它们同样是不可变类型。
原始数据类型的局限性:
原始数据类型不能和泛型配合使用:因为泛型是在编译的时候自动将类型转换为对应的特定类型,这就决定了使用泛型必须保证需要转换的相应数据类型能转换为object。
引用数据类型的局限型:
Java的对象都是引用数据类型。例如vector,它不像数组那样,内部存储结构是连续的内存。它们存储的是引用;因此对象往往是分散地存储在堆的不同位置;这样增加了灵活性,但是也导致数据操作的低效,尤其是无法充分利用CPU缓存机制。
补充: 一个对象大体分为3个部分:对象头,实例数据,对齐填充。
其中对象头包括两个部分:第一部分存储哈希码,GC分代年龄,锁状态标志,线程持有的锁等,第二部分是类指针。
实例数据部分存储的是对象真正存储的有效信息。
对齐填充是不必然存在的,也没有特别含义,只是起到占位符的作用。因为hotspot 自动内存管理系统要求对象初始地址是8字节的整倍数。