黑马程序员技术交流社区

标题: int自动装箱和拆箱的问题 [打印本页]

作者: 李增强    时间: 2012-3-29 22:47
标题: int自动装箱和拆箱的问题
public class test {
        public static void main(String[] args) {
                Integer x=365;
                Integer y=365;
                System.out.println(x==y);
        }
}

上面代码为什么运行结果是false,integer不是有自动拆箱吗,可以用==吗?
作者: 肖发腾    时间: 2012-3-29 22:58
这里需要注意一点,在-128在127之间,自动装箱拆箱可行,但是超出了这个范围之后,则不再会这样,jvm会为它们分别开辟内存空间。
在-128到127之间的数字经常被用到,这些不每次都为它们开辟空间,可以大大节约内存。这是结合毕老师和自己的理解。呵呵
作者: 何万县    时间: 2012-3-29 23:13
JDK5.0后Integer确实可以实现自动装箱,但是你现在写的是两个Integer对象,没有对Integer对象进行数学运算,而是直接用==来比较,这时是不会自动拆箱的,JVM只会比较两个对象的hash值是否相同,因为是两个对象,hash值肯定不同,所以是false。这个算法没有体现出来Integer的自动拆箱功能。
作者: 胡川    时间: 2012-3-29 23:18
给你绝几个例子 你就知道了

public class Test1 {
    public static void main(String[] args) {
         Integer i1 = 256;
         Integer i2 = 256;
       if (i1.equals(i2) )
            System.out.println("相等");
       else
            System.out.println("不相等");
    }
} 显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。
所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等

*******下面
这个例子就和你的例子相似
public class Test1 {
    public static void main(String[] args) {
         Integer i1 = 256;
         Integer i2 = 256;
       if (i1==i2)
            System.out.println("相等");
       else
            System.out.println("不相等");
    }
} 结果是不相等的。
==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。

public class Test1 {
    public static void main(String[] args) {
         Integer i1 = 127;
         Integer i2 = 127;
       if (i1.equals(i2) )
            System.out.println("相等");
       else
            System.out.println("不相等");
    }
} 结果是相等的。显然比较的内容相等。


public class Test1 {
    public static void main(String[] args) {
         Integer i1 = 127;
         Integer i2 = 127;
       if (i1==i2)
            System.out.println("相等");
       else
            System.out.println("不相等");
    }
}结果是相等的。由于自动装包,它们其实都是装在一个Integer对象中。
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。

作者: 李增强    时间: 2012-3-29 23:28
何万县 发表于 2012-3-29 23:13
JDK5.0后Integer确实可以实现自动装箱,但是你现在写的是两个Integer对象,没有对Integer对象进行数学运算 ...

我若是把365改成100就是true了哦
作者: 何万县    时间: 2012-3-29 23:37
李增强 发表于 2012-3-29 23:28
我若是把365改成100就是true了哦

这是JAVA的一个特性,如果你Integer变量的数值能在一个字节内存放,也就是小于127,那么你虽然创建了两个Integer变量,但是实际上是同一个,第二个只是第一个的引用,两个Integer变量相同,自然hash值也相同,如果变量的值超过了一个字节存大小,也就是大于127那么JVM就会自动再创建一个新的变量来存放这个数字,这时是两个变量,自然hash值也不一样,那么结果肯定是false。不信你可以试试,小于100的所有数比较结果都是true。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2