先来看一段代码:
奇怪了,看完这段代码,这是怎么回事?==是比较对象引用吗,那i==j怎么会为false,难道==比较的对象的值,a==b好像支持这一观点,咦,那m==n怎么又成了false了,真是把我搞晕了。
有什么办法,上网查资料。经过一段时间的网搜,终于有眉目了。看完下面一段话,豁然开朗,==比较的还是对象的引用,只不过封装类有自动装箱和拆箱在搅乱。
下面是网上的一段解释:
对于如下范围内的简单数据类型:
*
boolean类型的值
*
所有byte类型的值
*
在-128~127之间的short类型的值
*
在-128~127之间的int类型的值
*
在/u000~/u007F之间的char类型的值
它们在使用自动装箱转换成相关封装类型对象的时候,其行为也和String型类似。在上面列表范围中的数据在进行自动装箱的时候,将首先检查内存中是否已经有使用自动装箱产生的具有相同值的对象。如果已经有一个“值”相同的对象存在,那么并不会产生新的对象。这个机制和使用String s=“test”这种方式产生一个字符串对象类似。也就是说,当简单类型的数据列表中的数据类型和对应范围内的值的时候,使用自动装箱得到的对象可能是已经在内存中存在的,而不是新产生的,就跟String类型数据一样。
public class Test20110712 {
public static void main(String[] args) {
Integer i = 3;
Integer j = i;
i++;
Integer a = 5;
Integer b = 6;
a++;
Integer m = 127;
Integer n = 128;
m++;
System.out.println(i==j); //false
System.out.println(a==b); //true
System.out.println(m==n); //false
}
}
奇怪了,看完这段代码,这是怎么回事?==是比较对象引用吗,那i==j怎么会为false,难道==比较的对象的值,a==b好像支持这一观点,咦,那m==n怎么又成了false了,真是把我搞晕了。
有什么办法,上网查资料。经过一段时间的网搜,终于有眉目了。看完下面一段话,豁然开朗,==比较的还是对象的引用,只不过封装类有自动装箱和拆箱在搅乱。
下面是网上的一段解释:
对于如下范围内的简单数据类型:
*
boolean类型的值
*
所有byte类型的值
*
在-128~127之间的short类型的值
*
在-128~127之间的int类型的值
*
在/u000~/u007F之间的char类型的值
它们在使用自动装箱转换成相关封装类型对象的时候,其行为也和String型类似。在上面列表范围中的数据在进行自动装箱的时候,将首先检查内存中是否已经有使用自动装箱产生的具有相同值的对象。如果已经有一个“值”相同的对象存在,那么并不会产生新的对象。这个机制和使用String s=“test”这种方式产生一个字符串对象类似。也就是说,当简单类型的数据列表中的数据类型和对应范围内的值的时候,使用自动装箱得到的对象可能是已经在内存中存在的,而不是新产生的,就跟String类型数据一样。