上海中企动力做网站多少钱,如何做一个个人网站,企业网上核名,域名设计从一道选择题开始分析选项A选项A中比较的是i01和i02#xff0c;Integer i0159这里涉及到自动装箱过程#xff0c;59是整型常量#xff0c;经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存#xff0c;这时i01就是Integer 的引用。而int i0259由于int是基本类型…从一道选择题开始分析选项A选项A中比较的是i01和i02Integer i0159这里涉及到自动装箱过程59是整型常量经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存这时i01就是Integer 的引用。而int i0259由于int是基本类型所以不存在引用问题直接由编译器将其存放在栈中换一句话说i02本身就是59。那么System.out.println(i01 i02)结果任何呢这里涉及到了拆箱的过程因为等号一边存在基本类型所以编译器后会把另一边的Integer对象拆箱成int型这时等号两边比较的就是数值大小所以是true。好了到了这里你有没有想到这样一个问题如果是Integer i0159Integer i0259然后System.out.println(i01 i02)的结果是可能你会说比较数值大小所以相等啊也有可能说等号两边对象引用所以比较的是引用又因为开辟了不同的内存空间所以引用不同所以返回false。可是正确答案是true.再来看这个问题如果是Integer i01300Integer i02300然后System.out.println(i01 i02)的结果是 你可能说上面你不是说了true嘛怎么还问这样的问题可是这次的答案是false。你是否会吃惊大牛除外我是小白求不打脸解析当靠想象无法解决问题的时候这是就要看源代码了很重要我们可以在Integer类中找到这样的嵌套内部类IntegerCacheprivate static class IntegerCache {//静态缓存类static final int low -128;static final int high;static final Integer cache[];static { //静态代码块// high value may be configured by propertyint h 127;String integerCacheHighPropValue sun.misc.VM.getSavedProperty(java.lang.Integer.IntegerCache.high);if (integerCacheHighPropValue ! null) {int i parseInt(integerCacheHighPropValue);i Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh Math.min(i, Integer.MAX_VALUE - (-low) -1);}high h;cache new Integer[(high - low) 1];int j low;for(int k 0; k cache.length; k)cache[k] new Integer(j);}private IntegerCache() {}}这个类就是在Integer类装入内存中时会执行其内部类中静态代码块进行其初始化工作做的主要工作就是把一字节的整型数据(-128-127)装包成Integer类并把其对应的引用存入到cache数组中这样在方法区中开辟空间存放这些静态Integer变量同时静态cache数组也存放在这里供线程享用这也称静态缓存。所以当用Integer 声明初始化变量时会先判断所赋值的大小是否在-128到127之间若在则利用静态缓存中的空间并且返回对应cache数组中对应引用存放到运行栈中而不再重新开辟内存。所以对于Integer i0159Integer i0259**i01 和 i02是引用并且相等都指向缓存中的数据所以返回true。而对于**Integer i01300Integer i02300因为其数据大于127所以虚拟机会在堆中重新new (开辟新空间)一个 Integer 对象存放300创建2个对象就会产生2个这样的空间空间的地址肯定不同导致返回到栈中的引用的只不同。所以System.out.println打印出false。B选项从上面的分析我们已经知道Integer i0159返回的是指向缓存数据的引用。那么Integer.valueOf(59)返回的是什么或者操作是什么呢这个函数的功能就是把int 型转换成Integer简单说就是装包那他是新创建一个对象吗还是像之前利用缓存的呢有了之前的经验肯定想到的是利用缓存这样做既提高程序速度又节约内存何乐而不为来看一下源代码public static Integer valueOf(int i) {assert IntegerCache.high 127;if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);}很明显跟之前的思想一致若在-128到127范围直接返回该对象的引用否则在堆中重新new 一个。到这System.out.println(i01 i03)的结果毋庸置疑就是true.选项CInteger.valueOf(59)返回的是已缓存的对象的引用而Integer i04 new Integer(59)是在堆中新开辟的空间所以二者的引用的值必然不同返回false,这道题呢就选C选项DSystem.out.println(i02 i04) i02是整型变量i04是引用这里又用到了解包虚拟机会把i04指向的数据拆箱为整型变量再与之比较所以比较的是数值5959返回true.学习并转载自https://blog.csdn.net/dawn_after_dark/article/details/74154338对我很有帮助感谢作者