当前位置:编程学习 > JAVA >>

Integer中的==问题

求解答:java代码中

    @Test
    public void test(){
        Integer i1 = 1;
        Integer i2 = 1;
        boolean b = (i1 == i2);
        System.out.println(b);
    }

打印出来为true

    @Test
    public void test(){
        Integer i1 = new Integer(1);
        Integer i2 = new Integer(1);
        boolean b = (i1 == i2);
        System.out.println(b);
    }

打印出来为false

请问两者区别在哪?

后面这个比较容易理解,因为是两个不同的对象,但是前面的那个例子中为什么i1,i2是同一对象?求解释 --------------------编程问答-------------------- 第一个例子和第二个例子其实是一样的,只不过是新版本的java在语法上进行了简化,你可以把它看成是缩写 --------------------编程问答-------------------- 第一个好像是同一个对象,如果不是新new的话,如果有一样的值,好像是从池中获取的。。。
第二个比较的是对象的地址。所以是false。
--------------------编程问答--------------------
引用 1 楼 xodbc 的回复:
第一个例子和第二个例子其实是一样的,只不过是新版本的java在语法上进行了简化,你可以把它看成是缩写

俄....我说错了,貌似Integer也有个常量池,两个变量引用的是一个常量 --------------------编程问答--------------------
引用 2 楼 AA5279AA 的回复:
第一个好像是同一个对象,如果不是新new的话,如果有一样的值,好像是从池中获取的。。。
第二个比较的是对象的地址。所以是false。

正解! --------------------编程问答-------------------- http://www.ticmy.com/?p=110 --------------------编程问答--------------------
引用 楼主 courage89 的回复:
求解答:java代码中

    @Test
    public void test(){
        Integer i1 = 1;
        Integer i2 = 1;
        boolean b = (i1 == i2);
        System.out.println(b);
    }

打印出来为true

……


楼主, Integer i1=1; 和 Integer i1=new Integer(1); 定义是有区别的,前者就只是给Integer i1=1 赋值为1而已
 而第二种测完全不一样,你首先才有了新建一个对象Integer,再将1设置到Integer对象中去,故此就已经完全不一样了,所以再jvm 运行时,它首先进行对象判断,看看你是否时Integer 对象,结果发现你,第一种不时对象,故此就直接进行字符串进行判断了,故此相等,而第二种则完全不以为然,判断你时两个都是对象而且,再判断你对象里面的值是否是再同一个字符串空间中。 --------------------编程问答--------------------
引用 楼主 courage89 的回复:

楼主可以看看5楼的博客,说得很到位。
Integer i = 1; 相当于Integer i = Integer.valueOf(1),这个用到了Integer的缓存;
而Integer的==操作符,比较的是地址,当且仅当两者是同一个对象的时候,才会返回true。
所以直接赋值的话,是相等的。但是值域得在-128到127以内,因为Integer只缓存了这一个范围的对象。

同理,Integer i = new Integer(1); 这样就是新建的对象了,所以==肯定不相等。
所以平时我们尽量使用Integer.equal()来进行比较操作,因为这个能比较到实际上的int值。

有点类似于String…… --------------------编程问答--------------------
引用 7 楼 tiwerbao 的回复:
引用 楼主 courage89 的回复:
楼主可以看看5楼的博客,说得很到位。
Integer i = 1; 相当于Integer i = Integer.valueOf(1),这个用到了Integer的缓存;
而Integer的==操作符,比较的是地址,当且仅当两者是同一个对象的时候,才会返回true。
所以直接赋值的话,是相等的。但是值域得在-128到127以……
--------------------编程问答-------------------- java基础一定要坚实啊 --------------------编程问答-------------------- 楼主,这2种东西还是要多去看看啊,明显是不一样的,基础要掌握牢啊 --------------------编程问答-------------------- int i1 = 1; 
int i2 = 1;
你说i1==i2吗 1不能与1吗 --------------------编程问答-------------------- 第一个你是直接用的常量池里的1,后下面你是new的 integer对象 --------------------编程问答--------------------
引用 5 楼 ticmy 的回复:
http://www.ticmy.com/?p=110


ding! --------------------编程问答-------------------- 第一种是从常量池中比较的所以是true  因为池中已经有了个1
第二种是新开辟的内存空间,两个不同的对象 所以为false --------------------编程问答-------------------- 有一种东西叫做 池
有一种东西叫做 地址
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,