PHP小丑 发表于 2021-12-25 12:14:20

#yyds干货盘点# java包装类的自动拆箱和自动装箱学习笔记

自动装箱和自动拆箱是jdk5.0及其以上的新特性
jdk 1.5可以用
jdk1.4或者以下的版本都用不了


自动装箱(auto_boxing)自动拆箱(auto_unboxing)


Integer i1 = new Integer(10);
//这叫装箱
int i2 = i1.intVlaue();
//这叫拆箱




Integer i3 = 10; //自动装箱,直接将int类型用Integer类型来接受
int i4 = i3; //自动拆箱,直接用int类型接受Integer类型数据


public static void m1(object o){
System.out.println(o);
//jdk5.0及其以上版本是可以直接传入10即可,可以自动装箱
}


publit static int m2(Integer i1, Integer i2){
return i1 - i2;
// 由于引用类型肯定是不能直接进行加减运算的,这里肯定先将Integer类型转换为了int类型,所以有自动拆箱
}






深入自动装箱和自动拆箱
自动装箱和自动拆箱是程序编译阶段的一个概念和程序运行无关
自动拆箱和自动装箱只是为了提高写代码的效率
表面上看着是 直接
Integer i1 =10;
其实在编译的时候还是是 new integer(10) 将其装箱


以下例子
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.print(i1==i2);//false
这里是没有自动拆箱的,因为==比较的就是内存地址,i1和i2本身就是引用类型,所以不会自动拆箱转换为int类型,自动拆箱是发生在需要转换为int类型时
如果要比较两个Integer类型的值是否相等,要使用equlas方法,这也看出了,在Integer类中重写了equlas方法,object类中的equlas方法和toString方法写来就是被重写的




重点
Integer i3 = 128;
Integer i4 = 128;
System.out.print(i3==i4); //false
因为is和i4有自动装箱


Integer i5 = 127;
Integer i6 = 127;
System.out.print(i5==i6); //true


Integer i7 = -128;
Integer i8 = -128;
System.out.print(i7==i8); //true


Integer i9 = -129;
Integer i10 = -129;
System.out.print(i9==i10); //false


为什么127和-128的内存地址是一样的呢
因为:
    如果这个数据实在-128到127之间,java中引入了 “ 整型常量池” , 只要在-128到127之间就会在 “整型常量池”创建一份,就不会在堆中创建对象,所以上面的127和-128是在 “整型常量池中的”所以内存地址一样,但是只要超出了这个范围就是新创建对象,这个“整型常量池”和前面的 “字符常量池”类似
注意
    这个“整型常量池”只在Integer类型数据中有效,而且只能是自动装箱才会触发这个机制


https://blog.51cto.com/u_14646397/4842260
页: [1]
查看完整版本: #yyds干货盘点# java包装类的自动拆箱和自动装箱学习笔记