黑马程序员技术交流社区
标题:
关于基本数据类型对象包装类的问题
[打印本页]
作者:
唐巍
时间:
2012-3-18 03:31
标题:
关于基本数据类型对象包装类的问题
请看代码:
class IntegerDemo
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
Integer z=8;//Integer z=8与int z=8有什么区别?
z=z*5;
sop("z="+z);
Integer m=128;
Integer n=128;
sop("m==n:"+(m==n));//打印结果:false m和n数值相同,为什么比较结果为false?
Integer a=127;
Integer b=127;
sop("a==b:"+(a==b));//结果:true 这里a和b比较结果为什么又为true呢?
}
}
作者:
adison
时间:
2012-3-18 04:12
本帖最后由 adison 于 2012-3-18 04:14 编辑
你所说的都是JDK1.5版本以后出现的新特性。
Integer z=8;相当于Integer z = new Integer(8);,这叫
自动装箱
Integer z=8;(这是一个
Integer对象
,代表的int值是8)而int z=8;(是一个
int类型的变量
,值是8)
Integer m=128;
Integer n=128;
sop("m==n:"+(m==n));//m,n代表两个
不同的Integer对象,内存地址不同
Integer a=127;
Integer b=127;
sop("a==b:"+(a==b));//a和b指向了
同一个Integer对象
,这是新特性,当数值在byte范围内时,对于新特性,如果该数值已经存在,则不会再开辟新的空间
作者:
刘元明
时间:
2012-3-18 08:41
Integer z=8表示将8封装成一整数包装类对象,此时它可以作为元素存在于集合中并可以取出
而int z=8就是一简单赋值过程,表变量z记住8这个数值,它要想存在于集合中需借助数组,或者进行上述封装才能取出
再者声明Integer z,z可以为null,这当然不是int z所具有的。
Integer m=128;
Integer n=128;
若数值在byte(-128到127)范围内时,对于jdk1.5版本后出现新特性,如果该数值封装对象已经存在,则不会再开辟新的空间,而是引用指向同一封装对象
而128不满足新特性条件,就表示m,n分别是new出的两个对象,地址当然不一样,所以返回false
而数值127满足新特性a,b指向同一对象,所以返回true
作者:
薛波
时间:
2012-3-18 08:45
public static void main(String[] args)
{
Integer z=8;//Integer z=8与int z=8有什么区别?
z=z*5;
sop("z="+z);
Integer m=128;
Integer n=128;
sop("m==n:"+(m==n));
//打印结果:false m和n数值相同,为什么比较结果为false?
//JDK1.5版本以后出现的新特性,当数值在byte范围内(-128到127)时,对于新特性,如果该数值已经存在,则不会再开辟新的空间,而且128超过了其范围所以每个引用对象都自己创建了一个引用地址所以比较会出现上面的结果
//解决方法1 用对象比较方法equals
sop("m==n 1:"+(m.equals(n)));
//解决方法2 用这两个对象的具体值比较
sop("m==n 2:"+(m.intValue()==n.intValue()));
Integer a=127;
Integer b=127;
sop("a==b:"+(a==b));//结果:true 这里a和b比较结果为什么又为true呢?
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2