代码如下(已经在jdk1.6.10下编译测试运行,无异常报错)
public TestEquals{
  public static void main(String... args){
     for(int i=0;i<150;i++){
        Integer i1 = i;
        Integer i2 = i;
        System.out.print("i=" + i + " ");
        System.out.println(i1.equals(i2));
     }
  }
}输出结果令人迷惑:
i=1 true
i=2 true
...
i=127 true
i=128 false
...
i=149 false为什么从i=128开始,euqals比较输出就为false???
我也是在无意中发现,开始设定i=5时,输出为TRUE,后来设定一个i=200,输出就为false;所以写了上面这个循环测试代码。
初学者,还请各位高手指点迷津......

解决方案 »

  1.   

    这是因为java里面的缓存作用。只是缓存了一个字节。
      

  2.   

    i1.equals(i2)的结果一定是true,源码 public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
        }    public int intValue() {
    return value;
        }
    i1.equals(i2)改成i1==i2就是你说的那样,我不懂原因
      

  3.   

    1楼正解,Iterger类对int数据类型做了对象封装。
    但做了优化一个字节,128不在这个范围。
      

  4.   

    看看我的贴子:
    http://topic.csdn.net/u/20081119/12/b3c447ef-6665-4225-8d36-60e211663bb3.html
      

  5.   

    楼主代码确信测试过?
    没有关键字class哎。
    我在自己机器上测试发现使用equals返回的总是true,而使用==返回的和楼主的输出结果一样。
    看来==比较的是引用,而equals比较的是引用的对象。///:TestEquals.java
    public class TestEquals{
      public static void main(String[] args){
        for(int i=0;i <150;i++){
            Integer i1 = i;
            Integer i2 = i;
            System.out.print("i=" + i + " ");
            System.out.println(i1==i2);
        }
      }
    }
      

  6.   

    补充一句:我用的是JDK 1.6.0_07
      

  7.   

    jvm内部缓冲了前面的数字,这问题以前都测试过了。只不过如果是equals,将全部是 true,只有 == 时,前面是true,后面是 false;你的代码应该是你贴错了,或者没有正确编译吧
      

  8.   

    jvm内部缓冲了前面的数字,这问题以前都测试过了。只不过如果是equals,将全部是 true,只有 == 时,前面是true,后面是 false;你的代码应该是你贴错了,或者没有正确编译吧
      

  9.   

    Iterger类对int数据类型做了对象封装。 
    但做了优化一个字节,128不在这个范围。