Integer i1 = new Integer(2);
Integer i2 = new Integer("2");
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
结果为:false true
Integer i3 = 2;
Integer i4 = 2;
System.out.println(i3==i4);
System.out.println(i3.equals(i4);
结果为true true;
Sysout.out.println(i1 == i3);
结果为flase 请教下大家,为什么会得出这样的结果呢?能详细点说下吗。?

解决方案 »

  1.   

    简单提一下,在用new Integer(2)和new Integer("2")时,不管原来在栈里有没有2这个整型量,都会新构造一个新的Integer对象;
    既然new Integer(2)和new Integer("2")构造了两个对象,那它们的地址肯定不一样,所以i1==i2就是false;
    但是equals是比较内容而不是地址,所以i1.equals(i2)就是true啦。Integer i3 = 2; 
    Integer i4 = 2;
    上面这两个都是从栈里取出来的,所以无论是地址还是值都相同的。
      

  2.   

    Integer i1 = new Integer(2); 
    Integer i2 = new Integer("2"); 
    System.out.println(i1==i2); 
    System.out.println(i1.equals(i2)); 
    结果为:false true 
    因为:i1==i2比较的是对象的引用,
    i1和i2本来就是不同的对象,引用不同的内存。只不过他们的内容相同而已Integer i3 = 2; 
    Integer i4 = 2; 
    System.out.println(i3==i4); 
    System.out.println(i3.equals(i4); 
    结果为true true; 
    因为:i3和i4创建的是规范化字符串,也就是说他们存储在同一对象中。他们的引用的是同一内存。
    i3.equals(i4)比较的是他们的值是否相等。Sysout.out.println(i1 == i3); 
    结果为flase 
    因为:不知道
      

  3.   

    Sysout.out.println(i1 == i3); 
    结果为flase 
    因为:i1和i3是俩不同的对象,地址不同!
      

  4.   

    Sysout.out.println(i1 == i3); 
    结果为flase 
    因为:Integer i3 = 2; //这里创建的对象与前面两个是毫无关联的。这个语句新划出了一小块内存用来保存对象i3,
    Integer i4 = 2; //这里使得i4的引用指向了i3的引用,即i3和i4这时引用了同一块内存。
      

  5.   

    嗯。谢谢大家的指点,现在有点明白了,==比较的是两个对象是否为一个对象,equals比较的是两个对象的值是否相同,是这样吧
      

  6.   

    i1和i2楼上的都说很清楚了至于i3和i4,因为这个是JDK1.5才有的,具体JVM内部是怎么构建对象不太清楚,所以说不上为什么,就不瞎说免得误导了  在JDK1.4以及更早版本的时候Integer i = 2;这样的语句是不合法的,因为左边的是对象的引用,右边是基本数据类型,这是两个根本不同的东西怎么能赋值呢?必须写成Integer i = new Integer(2);。  但是这样写比较繁琐,所以在JDK1.5以后,Integer i = 2;变成合法的了,但是仍然有new Integer(2)这个操作,只不过是编译器在后台帮你做了,你不知道而已。不过编译器是具体怎么来实例化这个对象我还不清楚,有哪位大大知道的,顺便告诉我一下?
      

  7.   

    在开始解答你的问题前,先声明一下:
    == 比较的是两个对象所在的“地址值”,而equals在这里比较的是两个对象“所包含的值”是否相等。然后各自返回boolean值。
    所以:Integer i1 = new Integer(2); 
    Integer i2 = new Integer("2"); 
    System.out.println(); 
    System.out.println(i1.equals(i2)); 
    结果为:false true 
    1、因为i1,i2是两个不同的对象,其所在的堆地址不同,所以i1==i2为false
    2、但是这两个对象所包含的值为相同的int值2,所以i1.equals(i2)返回true
    Integer i3 = 2; 
    Integer i4 = 2; 
    System.out.println(i3==i4); 
    System.out.println(i3.equals(i4)); 
    结果为true true;
    3、这里Integer i3 = 2; Integer i4 = 2; 其实是生成了同一个对象,只是不同的两个句柄(i3,i4)而已,所以i3,i4指向的对象地址是一样的,则此时i3==i4为true。
    4、i3.equals(i4)为true,同第二条。

     
    Sysout.out.println(i1 == i3); 
    结果为flase
    5、同第一条
      

  8.   

    Integer i3=2;
    和Integer i3 = Integer.valueOf(2);相同
    jdk1.5后的用法,好像是叫自动封装,可以去看Integer.java的源代码,
    Integer静态缓存了Integer对象:-1024~1024,如果超出这个范围也会new Integer
    所以比较还是要用equals,或者比较intValue()
      

  9.   

    == 比较2个对象的引用
    equal() 比较 2个对象的语义值关键是要比较什么 想要获取什么效果?
    是要确定 2个对象的 语义值一样 还是确定2个对象是一个引用我发现 java 给 基础数据的包装类 实现了 对象池
    是因为 包装类 没有改变本身语义内容的方法
    当他们改变了值之后 其实是 建立了新的对象是不是 象这样的内部值不能改变的对象 比较引用是没意义的
    因为 这样的对象初始化后就 一定代表了 一个语义 本身又没有什么改变内部值的方法
    没必要 使用'=='
      

  10.   

    请看 http://topic.csdn.net/u/20080608/14/80c83de3-5774-4d04-8fa5-53e5d18266e4.html
      

  11.   


    == 比较的是内存地址
    equals比较的是值
      

  12.   

    Integer i1 = new Integer(2); 
    Integer i2 = new Integer("2"); 
    System.out.println(i1==i2); 
    System.out.println(i1.equals(i2)); 
    结果为:false true 
    因为:i1==i2比较的是对象的引用, 
    i1和i2本来就是不同的对象,引用不同的内存。只不过他们的内容相同而已 Integer i3 = 2; 
    Integer i4 = 2; 
    System.out.println(i3==i4); 
    System.out.println(i3.equals(i4); 
    结果为true true; 
    因为:i3和i4创建的是规范化字符串,也就是说他们存储在同一对象中。他们的引用的是同一内存。 
    i3.equals(i4)比较的是他们的值是否相等。
    Sysout.out.println(i1 == i3); 
    结果为flase 
    因为:i1和i3是俩不同的对象,地址不同!
      

  13.   


     编译器先new一个值为2的对象,用i3引用之;
     后编译i4=2;
     却发现“=2;”的操作已做过一次
     用i4引用i3引用的对象了。//编译器真是知道节约啊。哈哈
      

  14.   

    其他的也就不必多说啦,只说说
    Sysout.out.println(i1 == i3);
    结果为flase 
    因为i3是引入java缓存内的integer对象(如上说),如果不是new的对象,对数据类型的引入在-1m~1m的范围内
    引入的都是缓存内的同一个对象(同一片内存空间)。如果new拉,就是另外开辟拉内存空间创建拉新对象,
    再就是"=="比较的是对引用的内存地址的比较
    而"equals"比较的单是对象内的值,这两个语句所比较的内容是不一样的 
      

  15.   

    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 1000;
    Integer i4 = 1000;
    System.out.println(i1==i2);
    System.out.println(i3==i4);
    正确答案是
    true
    false
    如果面试者写这样的写是错误的,就算通过。
    这个的原因要从java5的Boxing和unboxing谈起,boxing就是封装基本类型的对象,unboxing就是转换对象到基本类型。
    Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。
    Boxing
    在jdk1.4.2中,
    必须是// Assigning primitive type to wrapper type
       Integer iWrapper = new Integer(10);
    java5中
     // Assigning primitive type to wrapper type
       Integer iWrapper = 10;
    unboxing
    在jdk1.4.2中,
    int iPrimitive = iWrapper.intValue();
    java5中
    int iPrimitive = iWrapper;
    下面是基本类型作为对象存储的范围,
    boolean values true and false 
    All byte values 
    short values between -128 and 127 
    int values between -128 and 127 
    char in the range \u0000 to \u007F 
    如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
    所以这段代码,大家不要奇怪
    System.out.println(0L == 0);
    System.out.println(((Long)0L).equals(0));
    第二行代码是0不等于0
    因为大家犯这样的一个错误
     static private final String LOCK = "LOCK";
      void testMethod() {
        synchronized(LOCK) {
        ...
        }
      }
    应该用new,不要直接=,对于int,最好使用int a[0] ,因为array也是对象,不像Integer,a[0]的值可以改变。
      

  16.   

    Integer i1 = new Integer(2); 
    Integer i2 = new Integer("2"); 
    System.out.println(i1==i2); 
    System.out.println(i1.equals(i2)); 
    结果为:false true 
    因为:i1==i2比较的是对象的引用, 
    i1和i2本来就是不同的对象,引用不同的内存。只不过他们的内容相同而已 Integer i3 = 2; 
    Integer i4 = 2; 
    System.out.println(i3==i4); 
    System.out.println(i3.equals(i4); 
    结果为true true; 
    因为:i3和i4创建的是规范化字符串,也就是说他们存储在同一对象中。他们的引用的是同一内存。 
    i3.equals(i4)比较的是他们的值是否相等。 Sysout.out.println(i1 == i3); 
    结果为flase 
    i1和i3是俩不同的对象,地址不同
      

  17.   


    i1和i2都是对象,在栈内存中,i2是一个表示字符串指定的整数值的 Integer 对象
    所以 i1 == i2 ,返回的是falsei3和i4是数值,数值之间比较返回的肯定是truei1是对象,i3是数值, i1 == i3,返回的是false
      

  18.   

    写错了,更正一下i1,i2,i3,i4都是对象的引用所以用 == 比较都是false但是i3和i4有些特殊
    可用用String类参考,String s1 = "a"; String s2 = "a";
    s1 == s2 就是true,因为s1和s2指向的是同一个字符串
      

  19.   

    ....刚试了一下,我也有点晕了Integer i = n;  n在 -128~~127之间的时候,i1 与 i2 之间的比较就为true,超过这个范围就为false哪位大侠解释一下?
      

  20.   

    Integer i1 = new Integer(2); 
    Integer i2 = new Integer("2"); 
    //都是构造Integer的对象,但是你后面是new的对象都放在堆内存中,是两个不同的地址。
    System.out.println(i1==i2); //比较的是两个参数的内存地址(不相同)
    System.out.println(i1.equals(i2)); //比较的是两个参数的值。
    结果为:false true 
    Integer i3 = 2; 
    Integer i4 = 2; 
    //在栈内存中,指向同一内存空间,所以无论是地址还是数值都是相等的/
    System.out.println(i3==i4); 
    System.out.println(i3.equals(i4); 
      

  21.   

    因为java默认-128~~127在缓存里面已经有拉。是为拉方便经常操作的数据类型,所以已经初始化拉一些,
    但是范围只有-128~~127,超出这个范围就用new来创建新数据类型对象
      

  22.   

    ==比较是对象的内存地址
    equals()比较是是里边的值
    如果用NEW的话地址是肯定不一样的