刚刚有个问题有点困惑Integer x = 100;
Integer y = 100;
System.out.println(x == y);结果是ture如果吧x和y 的值改成 大于127的结果又是false。 这是什么原理啊??

解决方案 »

  1.   

    学JAVA要学会看源码Ieteger是对int的封装
    如果范围是在-128到127之间,直接返回的是int所以比较地址
    如果在这个范围外,就返回Integer,是对象了
    你也可以用比-128小的数字比较久知道了
      

  2.   

    在-128到127之间,Integer和Short类型的是可以用“==”,超过这个范围,如果想比较的话,就用equals()方法。这个属于装箱那块的。或者你比较的两者所引用的对象是相同的,也可以用“==”
      

  3.   

    就像4L说的那样,超出int的范围啦
      

  4.   

    Integer的比较式按字节进行比较:如果在-128~127之间是比较值,而
    当超出这个范围的时候,作为引用类型,则是去比较它们的内存地址,对应的
    的内存地址里面的内容相等,但地址却不等。
    这是java编译器定义的,是为方便使用
      

  5.   

    我基础不好...
    一般我用if判断两个数不能==之后都是直接equal的...
    呵呵 尤其是String。。
    但是原因不知道....
      

  6.   

    为什么大家觉得很简单的题目,真像就这么难呢。谁说在-128~127之间是比较值了?????还是看看源码:
       /* 
        * 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则 
        * 通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过 
        * 缓存经常请求的值而显著提高空间和时间性能。  
        * @param  i an <code>int</code> value. 
        * @return a <tt>Integer</tt> instance representing <tt>i</tt>. 
        * @since  1.5 
        */  
        public static Integer valueOf(int i) {  
             final int offset = 128;  
             if (i >= -128 && i <= 127) { // must cache   
               return IntegerCache.cache[i + offset];  
             }  
             return new Integer(i);  
        }  
     
       /* 
        * IntegerCache内部类 
        * 其中cache[]数组用于存放从-128到127一共256个整数 
        */  
        private static class IntegerCache {  
           private IntegerCache(){}  
         
           static final Integer cache[] = new Integer[-(-128) + 127 + 1];  
         
           static {  
               for(int i = 0; i < cache.length; i++)  
               cache[i] = new Integer(i - 128);  
           }  
       }  
    首先:
     if (i >= -128 && i <= 127) { // must cache   
               return IntegerCache.cache[i + offset];  
     }
    返回的是IntegerCache中的静态数组cache. 而这个数组中的每一个元素都是Integer类型的,怎么从很多人口里就成了int类型的呢。实际上:Integer i=100; -> Integer i=Integer.valueOf(100) -> Integer i= IntegerCache.cache[228] 
    也就是说Integer引用i中存储的是IntegerCache中Integer数组中的第228个元素的地址。  而不是你们说的什么值比较。 另外, Integer j=100; 那么j存储的也是这个地址。因为cache数组是IntegerCache类的静态数组,唯一的一个。因此i==j 仍然是比较地址,也就相等了。不是什么在值比较。至于Integer i=200; -> Integer i=Integer.valueOf(100) -> Integer i= new Integer(200);
     Integer j=200; -> ....  ->Integer j=new Integer(200);这个大家就都知道了,就是i,j存储的是堆中的两个Integer对象的地址。i==j 就不等了。http://hxraid.javaeye.com/blog/614440
      

  7.   

    我觉得如果是新手,不应该拘泥于这种题目。
    如果是Object想比较是否相等,应该用equals而不是用==。如果是兴趣爱好想钻研,就的确是应该像楼上的那样去看源码最合适。
      

  8.   

    Integer不同于int,所以要注意范围啊!
      

  9.   

    integer 是个整型对象。int是个基本变量!
    Ieteger是对int的封装
    如果范围是在-128到127之间,直接返回的是int所以比较地址 
      

  10.   

    java中的“==”和其他语言有一定的区别,在比较时用equals应该可以避免的