楼主看一下 Integer 的valueOf 的实现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);
    }Integer 会将127 以内的数字缓存在缓存池中,而大于等于128的数字,则需要new 出来
Integer.valueOf(127) == Integer.valueOf(127);  // true
Integer.valueOf(128) == Integer.valueOf(128);  // falseInteger num1 = 150;
Integer num2 = 150;
System.out.println(num1 == num2);
这里面涉及拆箱装箱的操作,JVM 先将num1,num2  做个IntegerValueOf() 操作,然后再做 == 比较

解决方案 »

  1.   

    答案解析:
    1.== 比较的是对象的引用
    当且仅当比较的两个引用指向同一对象才返回true 。
     
    2.Integer i = XXX
    看看Integer 的源代码就知道了,其实就是Integer 把-127-128 之间的每个值都建立了一个对应的Integer 对象,类似一个缓存。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。
       Integer i = XXX ,就是Integer i = Interger.valueOf(XXX), 首先判断XXX 是否在-127-127 之间,如果是直接return 已经存在的对象,否则就只能new 一个了。
      

  2.   

    在Java语言里:
    1)对于对象来讲(String,Integer等大写字母开头的类型所定义的对象),除了去判断是否为空(null)可以使用==以及!=以外,尽可能的使用equals来判断值是否相等
    2)基本数据类型(char,int等小写字母开头的类型)可以使用==和!=进行安全的判断示例:
    package topics_390899847;public class Example {
        public static void main(String[] args) {
            // 错误、危险的书写方法
            Integer a100 = 100;
            Integer b100 = 100;
            System.out.println("a100 == b100:" + (a100 == b100));
            Integer a155 = 155;
            Integer b155 = 155;
            System.out.println("a155 == b155:" + (a155 == b155));        System.out.println("new Integer(0) == new Integer(0):"
                    + (new Integer(0) == new Integer(0)));        Integer i = new Integer(0);
            Integer j = new Integer(0);
            if (i <= j && j <= i && i != j) {
                System.out.println("不可思议的走到了这里");
            } else {
                System.out.println("不可思议的居然没走到这里");
            }        // 正确、安全的书写方法
            System.out.println("a100.equals(b100):" + (a100.equals(b100)));
            System.out.println("a155.equals(b155):" + (a155.equals(b155)));
            System.out.println("new Integer(0).equals(new Integer(0)):"
                    + (new Integer(0).equals(new Integer(0))));
        }
    }
    输出:
    a100 == b100:true
    a155 == b155:false
    new Integer(0) == new Integer(0):false
    不可思议的走到了这里
    a100.equals(b100):true
    a155.equals(b155):true
    new Integer(0).equals(new Integer(0)):true其中【不可思议的走到了这里】和【什么东西又黑又白又红】一样,
    颠覆了大多数程序员的常识……而【new Integer(0) == new Integer(0):false】
    又打破了【-127-128 之间的每个值都建立了一个对应的Integer 对象】的神话……建议:
    1)推荐阅读《Java 解惑》【Java Puzzles是Effective Java作者写的一本关于Java语言中的一些“陷阱”相关的书】
    这次的疑问可以参考【Puzzle 32: Curse of Looper】2)最好用论坛的【代码->Java】来发表问题,这样回复的人很快就能通过复制、粘贴获得代码,不用重新敲一遍了
      

  3.   

    Java 解惑:陷阱、缺陷、犄角旮旯案例【旮旯:9个太阳才能照到的地方】
    Java™ Puzzlers: Traps, Pitfalls, and Corner Cases
    豆瓣书评【http://book.douban.com/subject/5362860/】C陷阱与缺陷
    C Traps and Pitfalls
    豆瓣书评【http://book.douban.com/subject/2778632/】这样的书是告诫程序员【不该做什么的书】,
    在看完告诉程序员【应该做什么】的《Java核心技术》或者《Java编程思想》之后,
    正式书写代码之前,
    值得认真阅读没读这本书之前____,读了这本书之后____。
    我最喜欢这样的书评了……我自己的真实感觉:
    没读这本书之前,觉得自己Java没啥不会的了,
    读了这本书之后,觉得后背都是冷汗……
      

  4.   

    Integer i = XXX 中,XXX会放入常量池中,只不过值要在-127-128之间。