评论

收藏

[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类型数据中有效,而且只能是自动装箱才会触发这个机制


关注下面的标签,发现更多相似文章