开发者社区> 问答> 正文

Integer的127与128:报错

代码:

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时是不等的。

这是怎么回事?

展开
收起
kun坤 2020-06-14 09:53:19 763 0
1 条回答
写回答
取消 提交回答
  • JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

    详细分析:http://my.oschina.net/xianggao/blog/84179

    ######对于较小数值的整型,在处理自动装箱的时候,采用常量池里面的值以节省内存,而大数值则是重新new出来的。这里刚好是分界线。######IntegerCache######

    引用来自“逝水fox”的答案

    对于较小数值的整型,在处理自动装箱的时候,采用常量池里面的值以节省内存,而大数值则是重新new出来的。这里刚好是分界线。
    默认128以下的,可以使用JVM参数改变此值.
    ######回复 @小小墨 : https://blog.csdn.net/maihilton/article/details/80101497######用哪个参数######

    引用来自“逝水fox”的答案

    对于较小数值的整型,在处理自动装箱的时候,采用常量池里面的值以节省内存,而大数值则是重新new出来的。这里刚好是分界线。
    正解..
    ######

    很明显,对于Integer来说,你用==比较的是对象引用地址,而不是Integer的值。

    ######因为短整型的范围是-128到127######

    一般是在面试中问到吧

    Integer a1 = new Integer(127); 换成这种试下 呵呵 /

    我觉得主要还是因为不规范的写法造成的,只是jdk优化了拆箱和封箱操作

    ######

    引用来自“java_cmm”的答案

    一般是在面试中问到吧

    Integer a1 = new Integer(127); 换成这种试下 呵呵 /

    我觉得主要还是因为不规范的写法造成的,只是jdk优化了拆箱和封箱操作

    多分析下JVM常量池
    ######回复 @六只 : 常量池就是八种基本包装类型的缓存,就是JVM维护的缓存。######回复 @六只 : “Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象” 这个是@爪哇老妖文章中提到的,他应该指的也是Integer的缓存######是Integer自己的缓存,不是JVM的常量池。缓存-128-127,源码中一清二楚。######

    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维护是指什么意思?怕啥,讨论讨论。嘿嘿



    2020-06-14 09:53:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载