A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李增强 初级黑马   /  2012-3-29 22:47  /  2398 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class test {
        public static void main(String[] args) {
                Integer x=365;
                Integer y=365;
                System.out.println(x==y);
        }
}

上面代码为什么运行结果是false,integer不是有自动拆箱吗,可以用==吗?

5 个回复

倒序浏览
这里需要注意一点,在-128在127之间,自动装箱拆箱可行,但是超出了这个范围之后,则不再会这样,jvm会为它们分别开辟内存空间。
在-128到127之间的数字经常被用到,这些不每次都为它们开辟空间,可以大大节约内存。这是结合毕老师和自己的理解。呵呵
回复 使用道具 举报
JDK5.0后Integer确实可以实现自动装箱,但是你现在写的是两个Integer对象,没有对Integer对象进行数学运算,而是直接用==来比较,这时是不会自动拆箱的,JVM只会比较两个对象的hash值是否相同,因为是两个对象,hash值肯定不同,所以是false。这个算法没有体现出来Integer的自动拆箱功能。
回复 使用道具 举报
给你绝几个例子 你就知道了

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:13
JDK5.0后Integer确实可以实现自动装箱,但是你现在写的是两个Integer对象,没有对Integer对象进行数学运算 ...

我若是把365改成100就是true了哦
回复 使用道具 举报
李增强 发表于 2012-3-29 23:28
我若是把365改成100就是true了哦

这是JAVA的一个特性,如果你Integer变量的数值能在一个字节内存放,也就是小于127,那么你虽然创建了两个Integer变量,但是实际上是同一个,第二个只是第一个的引用,两个Integer变量相同,自然hash值也相同,如果变量的值超过了一个字节存大小,也就是大于127那么JVM就会自动再创建一个新的变量来存放这个数字,这时是两个变量,自然hash值也不一样,那么结果肯定是false。不信你可以试试,小于100的所有数比较结果都是true。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马