Java内置类型的Autoboxing实现机制和Integer的CacheInteger的使用

在JAVA中,在比较两个对象的值是否相等时,我们都知道使用object.equals method,而不能使用"=="操作符进行比较,因为"=="比较的是object的内存地址,通过new创建的object的内存地址是不同的(当然,如果将一个对象指向另一个对象操作另当别论)。
       比如:
       Integer i1=new Integer(200);
       Integer i2=new Integer(200);
       此时i1和i2引用了不同的内存区域,所以“i1==i2”的比较结果是false,“i1.equals(i2)”的结果是true。
       因为Java使用了7中内置类型,这些内置类型都有与之对应的类,在内置类型可以与其对应的类之间进行自动转换,Java称其为“Autoboxing”。例如:
       Integer i3=200;     
       Integer i4=200;
       这次对i3和i4进行比较是遵循上面i1和i2的比较规则的。那么好,再看看下面的例子:
       Integer i5=100;     
       Integer i6=100;
       i5和i6进行"=="时的比较结果竟然是true,“i5.equals(i6)”的结果也是true。对于equals导致的放回结果没有什么惊奇,但是为什么"=="的结果是true呢?
       这个问题涉及到两个方 面问题:Autoboxing的实现机制和Integer的CacheInteger的机制。
       1.Autoboxing的实现机制
               Java的Autoboxing的实现机制是在对内置类型对应的类的"="运算符进行了重载,当没有使用new关键字创建对象时,Java就使用Autoboxing方式创建对象,"="重载对应着类的valueOf(parameter) method,parameter为其内置类型,比如Integer的valueOf method的parameter对应的就是内置类型int。这就是Java的Autoboxing的实现机制。
       2.Integer的CacheInteger的机制
               当理解了Java的Autoboxing机制之后,我们看看Integer的valueOf(int) method是如何实现的。(JDK1.6 Integer.java)
               public static Integer valueOf(int i) {
                 final int offset = 128;
                 if (i >= -128 && i <= 127) { // must cache
                         return IntegerCache.cache[i + offset];
                 }
                 return new Integer(i);
                 }             
               从以上代码可以清晰的看到,当没有使用new创建Integer object的时候,如果object的值在-128至127之间,返回的则是一个IntegerCache类的cache数组的一个元素(当然这个元素也是Integer类型的了),而不是new一个Integer object。再来看看IntegerCache是个什么东西。
               private static class IntegerCache {
                         private IntegerCache(){}
                         static final Integer cache[] = new Integer[-(-128) + 127 + 1];
                         static {
                                 for(int i = 0; i < cache.length; i++)
                                 cache[i] = new Integer(i - 128);
                         }
               }
               看到这里上面问题的答案已经出来了,原来Java的Integer class中有一个static的IntegerCache class,这个static class中的构造方法中创建了一个cache的Integer array,范围从-128至127。在不使用new关键字创建Integer类型的object的时候,如果这个Integer的范围在-128至127之间,则使用的是Integer的IntegerCache的cache array的一个Integer元素。如果不在这个范围,则调用Integer class的构造方法创建一个Integer object。
               所以上面i5和i6都引用了IntegerCache这个static class,这时在使用"=="进行比较的时候,i5和i6当然是相等的了。
               研究这个问题是因为在前几次上Java课时,老师将到了这个现象,但是并没有对此进行解决,有的同学怀疑是Java的bug,我感觉不像,因为Java不应该出现如此低级的bug。所以自己进行了一些测试,开始发现这个问题与值的大小有关,将值的范围逐步缩小,发现这个问题只有在-128之127之间有关(正好是1个带符号的byte),当时怀疑是java为了效率问题使用了一个byte表示值比较小的Integer object,但是后来通过debug形式,发现-128至127的Integer object的id竟然使用了一个id,也就是使用了同一个object。再后来就是查看了Integer的源码,再后来就是这篇文章了。
基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值