zoukankan      html  css  js  c++  java
  • 为什么 1000==1000 返回为false,而 100==100 会返回为true

    现象

    Integer a = 1000, b = 1000;
    System.out.println(a == b);//false
    Integer c = 100, d = 100;
    System.out.println(c == d);//true
    

    =** 运算比较的不是值而是引用

    分析

    其实正常情况Integer类型与int是不可能相等的,一个是对象类型(Integer ),一个是基础数据类型(int)。只是Java搞了自动装箱和拆箱机制,会将int转换成Integer,反之亦然。但是转换时正常情况下,装箱与拆箱的对象的内存地址应该是不同的,应该仍然不等才对,但是JVM让对应的-128~127的装箱对象都缓存起来了,这意味着每次装箱在这个范围的,直接从缓存取,不会new,通过这个trick让其相等 但是超出这个范围的默认还是一般原理就不相等了

    当我们给一个Integer 对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf 的源代码就知道发生了什么:

    public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
    	  return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }
    

    IntegerCache 是Integer 的内部类,其代码如下所示:

    /**
         * Cache to support the object identity semantics of autoboxing for values between
         * -128 and 127 (inclusive) as required by JLS.
         *
         * The cache is initialized on first usage.  The size of the cache
         * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
         * During VM initialization, java.lang.Integer.IntegerCache.high property
         * may be set and saved in the private system properties in the
         * sun.misc.VM class.
         */
    
        private static class IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];
    
            static {
                // high value may be configured by property
                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);
                        // Maximum array size is Integer.MAX_VALUE
                        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                    } catch( NumberFormatException nfe) {
                        // If the property cannot be parsed into an int, ignore it.
                    }
                }
                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;
            }
    
            private IntegerCache() {}
        }
    

    简单的说,如果整型字面量的值在-128 ~ 127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以才会出现上面的现象

  • 相关阅读:
    会议记录-5月20日
    会议记录-5月19日
    会议记录—5月18日
    会议记录-5月17日
    会议记录-5月16日
    会议记录-5月13日
    团队博客
    学习进度总结
    校外实习总结
    校外实习报告(二十)
  • 原文地址:https://www.cnblogs.com/tian-ci/p/10543077.html
Copyright © 2011-2022 走看看