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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周刚 中级黑马   /  2012-6-28 22:51  /  2880 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test2 {
    public static void main(String[] args) {
        Integer i1 = new Integer(2);
        Integer i2 = new Integer(2);
        int i3 =2;
        System.out.println(i1==i2);
        System.out.println(i3==i1);
    }
}
上面代码中输出结果为:
false
true
是不是第个比较的是两个引用的地址,而第二个是比较两个值呢?这是为什么呢?

评分

参与人数 1技术分 +2 收起 理由
刘蕴学 + 2 好问题

查看全部评分

6 个回复

倒序浏览
我来帮你解答!Integer是java中的引用对象,就像String一样,这些引用对象在使用==比较的时候就是比较两个对象在内存中的地址
比如String s=new String(“123”);和String s1=new String(“123”),当System.out.println(s==s1)的时候会输出false 而当 System.out.println(s。equals(s1));的时候会输出true
Integer 类也是如此。
而想反int是java中的基本数据类型它在使用==号的时候是比较两个的值,所以你用Integer 类==int值的时候比较的自然就是两个的值了,自然返回true了!
回复 使用道具 举报
楼主首先请记:只要有new,就肯定在堆内存中开辟一块空间。
Integer i1 = new Integer(2);这一句的执行过程是这样的:先在栈区新建一个对象i1,然后在堆里开辟内存把2放进去,最后让i1指向堆的首地址。Integer i2 = new Integer(2);执行过程也是这样的:先在栈区新建一个对象i2,然后再堆里新开辟一块内存,把2放进去(注意,这两个2有不同的地址,并不是同一个2),然后另i2指向堆的首地址。由以上过程可以看出,i1和i2存放的分别是两个2的首地址,故 System.out.println(i1==i2);输出结果为false;
int i3 =2;执行过程是这样的:在栈中新建对象i3,然后到堆中寻找有没有值为2的地址,此时发现i1所指向的地址正好值为2,所以将i3也指向2;故System.out.println(i3==i1);为true
其实两次比较比较的都是地址,不是值。楼主明白了吗

回复 使用道具 举报
楼主首先请记:只要有new,就肯定在堆内存中开辟一块空间。
Integer i1 = new Integer(2);这一句的执行过程是这样的:先在栈区新建一个对象i1,然后在堆里开辟内存把2放进去,最后让i1指向堆的首地址。Integer i2 = new Integer(2);执行过程也是这样的:先在栈区新建一个对象i2,然后再堆里新开辟一块内存,把2放进去(注意,这两个2有不同的地址,并不是同一个2),然后另i2指向堆的首地址。由以上过程可以看出,i1和i2存放的分别是两个2的首地址,故 System.out.println(i1==i2);输出结果为false;
int i3 =2;执行过程是这样的:在栈中新建对象i3,然后到堆中寻找有没有值为2的地址,此时发现i1所指向的地址正好值为2,所以将i3也指向2;故System.out.println(i3==i1);为true
其实两次比较比较的都是地址,不是值。楼主明白了吗

回复 使用道具 举报
游洪波 发表于 2012-6-28 23:07
我来帮你解答!Integer是java中的引用对象,就像String一样,这些引用对象在使用==比较的时候就是比较两个 ...

补充一句,你用i1.equals(i2)的时候,你看看结果是不是不一样了!
结果是true
回复 使用道具 举报
public class Test2 {
    public static void main(String[] args) {
        Integer i1 = new Integer(2);//开辟内存空间i1和i2开辟的内存空间属于同一个地址池,因此在i1==i2返回true,i1和i3不在同一个地址池i1==i3返回false
        Integer i2 = new Integer(2);
        int i3 =2;
        System.out.println(i1==i2);
        System.out.println(i3==i1);
    }
}
回复 使用道具 举报
Integer对象的构造方法会创建新的对象,用其内部的int value字段保存值。所有两个Integer对象,虽然内部的int值是一致的,但确是两个不同的对象。比如两个人都叫张三。

换个情景
Integer i1 = 1;
Integer i2 = 1;

这个方式会被java编译器编译成 Integer i1 = Integer.valueOf(1); 2同理,根据valueOf原理,他们返回的将是缓存中的同一个integer对象。

在java中,新特性拆箱和装箱指的是,如果你的表达式中有基本类型和其包装类型,那么包装类型将会被拆箱成为基本类型。
5 == new integer(5) 将会被拆箱,其表达式将会是  5 == new integer(5).intValue()
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马