Integer i01=2;
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);
System.out.println(i01==i02);
System.out.println(i01==i03);
System.out.println(i03==i04);
System.out.println(i02==i04);
为什么输出是
false
false
false
true
求解释。。越详细约好
Integer i01=2;
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);
见过类似的问题 估计i01是Integer i01=59; 而不是2 如果是59的话 i01==i02 为true 有个int基本数据类型会强转类型进行值得比较 true
i01==i02 Integer i01=2; i01是integer类型 是类 和 int i02=59;比较时会强制转换成int类型进行比较 2==59 肯定不对 false
i01==i03 一个是2一个强转后是59 false
i03==i04这两个都是integer包装类 它们在一起用==比较的话 比较的是存放数据的地址值 而不是自己所被赋予的值 false
i02==i04 02是int基本数据类型的 所以比较的是值 true
int 是基本数据类型 就是当作数字用的
Integer是其包装类(封装的),注意是一个类 可以方便的用来在各种类型间转化 要不然程序会报错(类型错误)
比如说 int a=0; string b=int.tostring(a); 这里涉及类型转换了 int—> string 前面会报错 改成string b=integer.tostring(a);才会编译通过
在比如说用到泛型的
List args;
这里<>需要类。如果你用int。它也会会报错的
两个是不一样的,int和Integer,特别是你使用
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);
i03和i04肯定是不一样的,他们各自是一个内存
System.out.println(i01==i02);
false 比较容易理解
System.out.println(i01==i03);
false 比较容易理解
System.out.println(i03==i04);
false 比较的是地址,不同,所以为fase
System.out.println(i02==i04);
true 比较的是值,相同
Integer i01=2;
int i02=59; //这里的a是一个指向int类型的引用,指向59这个字面值,并存在于栈中
Integer i03=Integer.valueOf(59); // static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例,在data segment中
Integer i04=new Integer(59); // Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值,在堆中
System.out.println(i01==i02);
System.out.println(i01==i03);
System.out.println(i03==i04);
System.out.println(i02==i04);
i02为基本数据类型,有基本数据类型的都是比较值,所以 (i02==i04)(i02==i03)
i03和i04分配内存的机制是不一样的,一个在在data segment中,一个在堆中;这两个实例的比较,会由于两个实例所在内存不同而不同(i03!=i04)
Integer类是包装类型,对包装类的自动装箱、自动拆箱也是一种语法糖, Java的new Integer操作,当参数值在【-128,127】之间时,new操作返回的对象是有缓存的,即如果new 一个Integer对象时该数值的对象未被创建过,则新建一个对象,并缓存起来,当再次遇到new同样数值的Integer时就把先前的对象返回来。
参考:http://blog.csdn.net/wojiushiwo945you/article/details/39212679