[Unix]
#yyds干货盘点# java包装类的自动拆箱和自动装箱学习笔记
服务系统
发布于:2021-12-25 12:14
|
阅读数:355
|
评论:0
|
自动装箱和自动拆箱是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类型数据中有效,而且只能是自动装箱才会触发这个机制
|
免责声明:
1. 本站所有资源来自网络搜集或用户上传,仅作为参考不担保其准确性!
2. 本站内容仅供学习和交流使用,版权归原作者所有!© 查看更多
3. 如有内容侵害到您,请联系我们尽快删除,邮箱:kf@codeae.com
|
|
|
|
|