兰州网站建设哪里好,南山网站设计训,搜索引擎优化策略,网站域名怎么登陆文/朱季谦
这是我很多年前的第一篇技术博客#xff0c;当时作为一名技术小菜鸟#xff0c;总体而言显得很拙见#xff0c;但也算是成长路上的一个小脚印#xff0c;希望能在以后的日子里#xff0c;可以对JAVA技术有一个更加深入的思考与认识。 前几天我在逛论坛的时候当时作为一名技术小菜鸟总体而言显得很拙见但也算是成长路上的一个小脚印希望能在以后的日子里可以对JAVA技术有一个更加深入的思考与认识。 前几天我在逛论坛的时候偶然看到有人讨论这样一个现象定义四个Integer类型的变量分别初始化赋值为a100b100c1000,d1000然后用println分别打印输出ab和cd的boolean值。这时就会出现一个很有趣的现象ab会被判断为ture而cd被判断为false。我觉得这个问题有点意思就自己在eclipse上玩了一遍运行截图如下 问题便来了同样类型的数值为何ab是正确的而cd则被判断为错误。在我们现实生活中人们总说要透过现象去看本质但若能反过来通过本质来分析现象我想同样可以深入理解很多东西。就像你能读懂一个人就会很容易理解这个人的所作所为。打一个比方你要弄懂一个人为何要犯罪首先得了解他做这件事的心理这就是通过本质回过头去看现象。 这道题如果能通过本质来看现象就会茅塞顿开。 Integer的本质是什么当然是它的源码咯。 在我们定义Integer a100时编译器会转成Integer.valueOf(100)即内部实现是Integer a Integer.valueOf(100)而在Integer的源码里valueOf方法如下 public static Integer valueOf(int i) {if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);} 通过Integer的内部代码可以看到有一个范围即IntegerCache.low和IntegerCache.high。通常情况两者默认初始化为IntegerCache.high127IntegerCache.low-128同时Integer内部还有一个静态static代码块它会在类被加载时被执行该代码块如下 static {int h 127;String integerCacheHighPropValue sun.misc.VM.getSavedProperty(java.lang.Integer.IntegerCache.high);if (integerCacheHighPropValue ! null) {try {int i parseInt(integerCacheHighPropValue);i Math.max(i, 127);h Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {}}high h;cache new Integer[(high - low) 1];int j low;for(int k 0; k cache.length; k)cache[k] new Integer(j);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high 127;} 在执行该静态代码块时会新建一个数组cache把-128到127的数字都放在这里面。再结合前面的valueOf方法可以看出如果赋值的参数在127个-128之间就会直接从静态代码块的缓存中返回一个实际数它们都属于同一个对象如果超过这个范围就会return new Integer(i)即返回一个新建且不同的对象值。 分析完Integer的部分源码后就可以知道前面问题为何会出现这样的现象了。当a,b赋值为100时两者都在127~-128的范围间在同一个缓冲中属于同一个对象且数值相同那样ab即为true而当cd赋值为1000时就超过了范围就会创建新的对象两个引用指向不同的对象即使对象拥有相同的内容用比较结果依然是false这样的话cd已不属于同一个对象了自然就会为false。