-什么是装箱和拆箱?
装箱:
原始类型到对应包装类的转换,比如int转换成Integer。
举个栗子:Integer i = 10;
拆箱:
反之, 将Integer对象转换成int类型值。
Integer i = 10;
int n = i;
注:
基本数据类型 | 包装类 |
---|---|
byte(1字节) | Byte |
short(2字节) | Short |
float(4字节) | Float |
long(8字节) | Long |
char(2字节) | Character |
int(4字节) | Integer |
double(8字节) | Double |
boolean(未定) | Boolean |
怎么实现?
装箱和拆箱是编译器自动完成的,装箱的时候调用的是包装类的valueOf()方法,该方法要传入的参数就是对应的基本数据类型,拆箱的时候就是自动调用包装类的xxxValue方法。
易错点:
public static void main(String[] args){
Integer a = 127;
Integer b = 127;
//== 比较的是两个对象的内存地址,
//如果其中有一个操作数是算术运算等表达式,则比较的是数值(即会触发自动拆箱的过程)
System.out.println(a==b);//true
Integer c = 128;
Integer d = 128;
System.out.println(a==b);//false
}
为什么两个比较的返回不相同呢?
这是因为JVM将-128到127之间的数值提前放到了方法区的整数型常量池中,所以当我们用到这个范围内的数值时,其引用的都是方法区的对象,同一个数值的对应的是同一个对象,因此上述代码中a==b返回的是true。而对于不在这个范围内的数值的引用,JVM会在堆中new一个对象,所以尽管数值是相同的,引用的对象每次都是不一样的,c==d返回的就是false。
拓展
Integer i = new Integer(xxx) 和 Integer i = xxx 的区别?
(1)通过new的方式不会触发自动装箱,而直接赋值则会触发
(2)通过new新建对象是直接在堆内存中新建一个对象,再赋值,这样每个new出来的对象都不是同一个对象。直接赋值的原理是;先在java的常量池中找,如果找不到再通过new Integer创建对象,进行装箱。
希望本文能对你有所帮助,如果有大佬发现有错误,还希望能帮我指出来!我及时纠正;或者有朋友能够补充的也可以提出来,大家一起学习,一起进步!