csdn原有一篇文章:
public class Test1 {
public static void main(String[] args) {
        Integer i1 = 127;
        Integer i2 = 127;
        if (i1 == i2) {
            System.out.println("i1==i2");
        } else {
            System.out.println("i1!=i2");
        }
        
        Integer i3 = 128;
        Integer i4 = 128;
        if (i3 == i4) {
            System.out.println("i3==i4");
        } else {
            System.out.println("i3!=i4");
        }
    }
}
输出是:
i1==i2 
i3!=i4 解释:
在用Integer比较的时候是会分两种情况的,当取值在-128~127之间时,是用原生数据类型,也就是int去作比较,除此之外都是用Integer,也就是比较它们的地址,所以才得出了以上的结果!现在:
public class Test {

    private static void modify(Integer i){
        i++;  
    }
 
    public static void main(String[] args) {
        Integer i1 = 100;
        Integer i2 = 200;
        
        modify(i1);
        modify(i2);
        
        System.out.println(i1);
        System.out.println(i2);
    }
}
输出:
100
200如果按照上面解释中的说法,是不是应该输出的是 100 201呢?

解决方案 »

  1.   

    在用Integer比较的时候是会分两种情况的,当取值在-128~127之间时,是用原生数据类型,也就是int去作比较我质疑这个说法...我在debug的时候, 当取值在-128~127之间时, 二个变量地址是相同的, 它们相等不是因为用原生数据类型比较, 是因为地址是相同的
      

  2.   

    Integer a = new Integer(20);
    Integer b = new Integer(20);

    System.out.println(a==b);
    你这样做的时候, 如果是用基本类型相比, 那应该是相等的吧, 但结果是不等的. debug看地址也是不同的
      

  3.   

    知道java串池吗, 我就是用理解串池的思路,去理解这个问题的 
      

  4.   

    比较是拿地址比较的,但是在用Integer包装类做参数试图改变其int值的时候,是不允许的
    因为Integer类是immutable的(不可变的),就如同String一样
      

  5.   

    串池了解一点,但是针对String吧
    在原帖里,有人也分析了jdk源码
    http://topic.csdn.net/u/20090523/14/443E23D0-6266-4E7D-B4C3-0FBC94AAA23B.html
      

  6.   


    基本类型所对应的类,比如int所对应的Integer,它们在被传递的时候,虽然传递的是对象,但是在方法里对对象所做的改变,在此方法以外对对象不造成任何影响。 
      

  7.   

    Integer比较的应该是两个对象在内存中的地址吧
    刚刚debug了一下 -128~127之间i1和i2的id和值都是一样的
    大于这个区间后i1和i2的值一样 但id不一样 这个id应该是指在内存中的地址吧..
    也就是说当Integer对象取值范围在-128~127之间时他们的值如果相等那地址也是一样的
    不知道说得对不对