博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动装箱、自动拆箱
阅读量:5312 次
发布时间:2019-06-14

本文共 1461 字,大约阅读时间需要 4 分钟。

自动装箱:把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等方法。

        如下:

        Integer a=3;//这是自动装箱

        其实编译器调用的是static Integer valueOf(int i)这个方法,valueOf(int i)返回一个表示指定int值的Integer对象,那么就变成这样: 

        Integer a=3;   =>    Integer a=Integer.valueOf(3);

拆箱:跟自动装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。

         如下:

         int i = new Integer(2);//这是拆箱

         编译器内部会调用int intValue()返回该Integer对象的int值

注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

集合框架中必须用包装类,不会自动装箱。

问题:自动拆箱和调用构造函数初始化的对象有区别

可以看一下valueOf()的实现

public static Integer valueOf(int i) {            if(i >= -128 &&i <=IntegerCache.high)               //如果i在-128~high之间,就直接在缓存中取出i的Integer类型对象             return IntegerCache.cache[i + 128];            else             return new Integer(i); //否则就在堆内存中创建       }

也就是说,这个东西是有缓存的,同理Char、Long也有缓存(-XX:AutoBoxCacheMax=<size>可以调整)

如果你将两个在缓存区间内的原始值赋给一个包装类型的变量,那么他们的内存地址完全一致。

这时,如果无论你怎么判断等价性,这两者都是等价的。

但是,如果这个原始值超出了缓存范围,或者使用了new Integer(i)这种显式的构造函数,那么这两者的内存地址就是不相同的。

这个不相同,通过equals()和hashcode()是看不出来的,因为他们在包装类里被重写了。

唯一能看出这两个区别的,就是A==B。

Integer a = new Integer(10086);Integer b = new Integer(10086);System.out.println(a==b);//结果:falseInteger a = new Integer(2);Integer b = new Integer(2);System.out.println(a==b);//结果:falseInteger a = 2;Integer b = 2;System.out.println(a==b);//结果:trueInteger a = 114514;Integer b = 114514;System.out.println(a==b);//结果:falseInteger a = 114514;Integer b = 114514;System.out.println(a.equals(b));//结果:true

 

转载于:https://www.cnblogs.com/hyfer/p/11079717.html

你可能感兴趣的文章
串口调试工具
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
通过adb命令查看SN、CID码等信息
查看>>
linux 常用shell命令之wc
查看>>
win 解除鼠标右键关联
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
Android源码编译9步---Nexus 设备出厂镜像
查看>>
fatal: early EOF fatal: index-pack failed & Git, fatal: The remote end hung up unexpectedly
查看>>
移动、联通和电信,哪家的宽带好,看完你就知道该怎么选了!
查看>>
Linux设置环境变量的方法
查看>>
Atitit.进程管理常用api
查看>>
Atitit.软件研发团队建设原理与概论 理论
查看>>
Atitit jsr规范有多少个 407个。Jsr规范大全
查看>>
Atitit 如何创新 创新只有在两种条件下发生:自由、效率。
查看>>
用户权限树的建立及递归算法思路原则
查看>>
MyBatis的foreach语句详解
查看>>
input
查看>>
【新坑】音乐生成
查看>>