Integer自动装箱和Integer.valueOf()
2017-10-28 09:51
281 查看
Java自动装箱可能大家都不陌生,基本数据类型由JVM自动转成对象类型。
在JDK1.5之前,我们是这么使用的
JDK1.5开始,我们就可以这样使用
使用起来确实很简单,下面让我们通过一个测试题深入了解下到底Integer是如何实现自动装箱的?
按照我们的逻辑,应该是返回三个true,但是事实是:
![](http://img.blog.csdn.net/20171028100906258?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG9zaW5nQ2FycnlKaWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
为什么?接下来让我们分析源码解释这个问题!
valueOf( )
![](http://img.blog.csdn.net/20171028101308417?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG9zaW5nQ2FycnlKaWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
JDK1.5之前我们使用的是valueOf()将基础类型包装成对象类型,通过源码我们可以看出当i的值不处于IntegerCache.low和IntegerCache.high之间时,将新建一个Integer对象,否则的话就返回IntegerCache.cache数组的值
这样就能解释为什么150和-129返回是fasle了,因为150不在范围内,自动装箱的时候new Integer(150)了两次,所以比较f3和f4的时候,实际上是比较两个值相同但是地址不同的对象,因此返回的是false,-129也是类似。
当然没有代码验证的理论都不可信,上面只是我们的猜想,接下来看看具体的源码来详细解释原因
![](http://img.blog.csdn.net/20171028102924838?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG9zaW5nQ2FycnlKaWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
打开IntegerCache类,low被定义成常量-128,所以-129不在这个范围内,将目光放到787行,h被赋值成127,788到800行是在编译时对传进来的参数进行判断,h最后被赋值成127,中间有段代码解释下
这句话是调用虚拟机内部的方法,根据硬件情况找到合适的最大值,一般不超过127,特殊的机型和特殊的硬件可以大于127,所以这个方法的定义的时候也是说“This method will always cache values in the range -128 to 127,inclusive, and may cache other values outside of this range.”是有可能超过这个范围的
801到805行是定义一个数组,并且生成相应数量的对象,当i处于范围中的时候,就不用新建对象而是取数组中的缓存值,所以f1和f2是相等地,因为是同一个对象。
在JDK1.5之前,我们是这么使用的
Integer iObject = Integer.valueOf(3); Int iPrimitive = iObject.intValue()
JDK1.5开始,我们就可以这样使用
Integer iObject = 3; int iPrimitive = iObject;
使用起来确实很简单,下面让我们通过一个测试题深入了解下到底Integer是如何实现自动装箱的?
public static void main(String[] args) { Integer f1 = 100; Integer f2 = 100; Integer f3 = 150; Integer f4 = 150; Integer f5 = -129; Integer f6 = -129; System.out.println(f1==f2); System.out.println(f3==f4); System.out.println(f5==f6); } 输出结果是什么?
按照我们的逻辑,应该是返回三个true,但是事实是:
为什么?接下来让我们分析源码解释这个问题!
valueOf( )
JDK1.5之前我们使用的是valueOf()将基础类型包装成对象类型,通过源码我们可以看出当i的值不处于IntegerCache.low和IntegerCache.high之间时,将新建一个Integer对象,否则的话就返回IntegerCache.cache数组的值
这样就能解释为什么150和-129返回是fasle了,因为150不在范围内,自动装箱的时候new Integer(150)了两次,所以比较f3和f4的时候,实际上是比较两个值相同但是地址不同的对象,因此返回的是false,-129也是类似。
当然没有代码验证的理论都不可信,上面只是我们的猜想,接下来看看具体的源码来详细解释原因
打开IntegerCache类,low被定义成常量-128,所以-129不在这个范围内,将目光放到787行,h被赋值成127,788到800行是在编译时对传进来的参数进行判断,h最后被赋值成127,中间有段代码解释下
String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
这句话是调用虚拟机内部的方法,根据硬件情况找到合适的最大值,一般不超过127,特殊的机型和特殊的硬件可以大于127,所以这个方法的定义的时候也是说“This method will always cache values in the range -128 to 127,inclusive, and may cache other values outside of this range.”是有可能超过这个范围的
801到805行是定义一个数组,并且生成相应数量的对象,当i处于范围中的时候,就不用新建对象而是取数组中的缓存值,所以f1和f2是相等地,因为是同一个对象。
相关文章推荐
- Integer.valueOf(int)及自动装箱内幕
- Integer.valueOf(int i)与自动拆箱与装箱
- Integer.valueOf(int)及自动装箱内幕
- Integer自动装箱拆箱bug,创建对象在-128到127
- Integer的自动拆箱和自动装箱的陷阱(整型数-128到127的值比较问题)
- Integer自动装箱、拆箱问题(转)
- java自动装箱、拆箱——Integer细节
- JavaSE8基础 Integer与int自动转换 自动装箱与拆箱
- Integer自动装箱超出赋值范围
- Integer的自动装箱与自动拆箱注意事项
- integer自动装箱拆箱&String内存分配测试
- int Integer 装箱 拆箱 自动装箱 自动拆箱
- Integer 自动装箱机制
- java基本数据类型及其所对应对象的自动装箱,new,valueof操作研究
- integer和int(自动拆箱和装箱)
- 1.4--1.5.4 泛型类A<Integer>与接口Interface A<Integer>、自动装箱/拆箱Integer->int、菱形运算符<>、数组协变、通配符?
- Integer自动装箱细节分析
- 16:自动装箱,Integer a = new Intege与Integer x的区别(实际上就是简写)
- Integer的自动装箱以及Int比较
- 黑马成员---StringBuffer,StringBuilder,Integer,自动装箱和拆箱,正则表达式:匹配,切割,替换,查找