代码:
Integer a1 = 127; Integer b1 = 127; if(a1==b1){ System.out.println("相等"); }else{ System.out.println("不等"); } Integer a = 128; Integer b = 128; if(a==b){ System.out.println("相等"); }else{ System.out.println("不等"); }运行结果是:
相等
不等
测试了下,两个Integer大于或等于128时是不等的。
这是怎么回事?
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。
详细分析:http://my.oschina.net/xianggao/blog/84179
######对于较小数值的整型,在处理自动装箱的时候,采用常量池里面的值以节省内存,而大数值则是重新new出来的。这里刚好是分界线。######IntegerCache######很明显,对于Integer来说,你用==比较的是对象引用地址,而不是Integer的值。
######因为短整型的范围是-128到127######一般是在面试中问到吧
Integer a1 = new Integer(127); 换成这种试下 呵呵 /
我觉得主要还是因为不规范的写法造成的,只是jdk优化了拆箱和封箱操作
######一般是在面试中问到吧
Integer a1 = new Integer(127); 换成这种试下 呵呵 /
我觉得主要还是因为不规范的写法造成的,只是jdk优化了拆箱和封箱操作
private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } 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() {} }@爪哇老妖 你说的JVM维护是指什么意思?怕啥,讨论讨论。嘿嘿
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。