public static void main(String[] args) {
Integer i1=new Integer(1);
Integer i2=new Integer(1);
int i3=1;

if(i1==i2){System.out.print("aaa");}
if(i1==i3){System.out.print("bbb");}
if(i1.equals(i3)){System.out.print("ccc");}
}运行结果是  bbbccc 为什么是这样 i2 和  i3引用的是同一个地址空间????

解决方案 »

  1.   

    i2 和 i3 一个在堆里一个在栈里 不是一样的 
    i1 和 i2 都是对象 比较两个的值要用equals
      

  2.   

    Integer 是应用类型 他们==为false
    int是指类型 他的值和i1 i2 等
      

  3.   

    java.lang.Integer是一个类.对它的操作要通过类的方法   
      int是JAVA缺省的8中基本数据类型之一.不是类的对象.
    int是基本数据类型,Integer是对int进行了封装的一个类。   
      声明为int的变量不需要实例化,声明为Interger的变量需要实例化   
    int是基本类型,Integer是包装类,也就是类。
    Integer   是比int   更高级的   数据类型   为什么java中使用int   而不像vb中那样使用Integer
    int是面向机器底层的数值类型,是Primitive类型的数据类型,而Integer是int的Warpper类,是面向对象的即OOP的对象类型。int   一般只用在数值计算中,而Integer是用在Java的其它要使用对象的地方,比如Map的Key与Value,List与Set的Element若要保存数值信息都要把int包装成Integer对象使用。
      

  4.   

    Integer是对象,int是基础类型用jdk1.4中就不会出现你那样的疑问i1==i3,其中,i1是对象,i3是基础类型,i1就调用Integer#intValue()方法,最终比较的是两个基本类型,而不是对象地址
      

  5.   

    没错,i1和i2是2个不同的生成对象,不相等,但i1和i2与i3应该都能等。。
      

  6.   

    ==是比较内存地址了吧,既然i3是存放在栈内存,i1是堆内存,那为什么==会是true呢?换句话说,是自动拆箱时候做的地址转化吗?还是其他的什么?大家都没说清楚。
      

  7.   

    其实我已经说了,i1调用了它的intValue方法
      

  8.   

    Integer i1,i2是引用,所以 i1==i2比较的是内存地址
    i3是值类型,然后在i1==i3的时候感觉应该是用的i1的值跟i3进行比较的,可能也想ls上说的,调用的intValue函数。
    另外equals函数应该也是比较的两个值的大小吧。 呵呵~~~~
      

  9.   

    Integer 是应用类型 他们==为false
    int是指类型 他的值和i1 i2 等
    integer是int的封装类
      

  10.   

    Java 5 开始 integer 等 有自动拆包打包 功能
      

  11.   

    其实争论的焦点是为什么i1==i3返回true
    javaSE5.0后,对于封装类,如Integer、Short、Boolean、Character等与基本数据类型int、short、boolean、char等进行运算时(包括比较),编译器会帮程序员打包解包:
    如果需要的是封装类对象,基本数据类型会自动打包成封装类对象:new Integer(i)//i是int型
    如果需要的是基本数据类型,封装类对像会解包成基本数据类型:i.intValue()//i是Integer的引用如这里
    i1==i3编译器会帮你写上:i1.intValue()==i3