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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test {
    public static void main(String[] args) {
        Integer it1 = new Integer(2);
        Integer it2 = new Integer(2);
        int i3 =2;
        System.out.println(it1==it2);
        System.out.println(i3==it1);
    }
}
打印结果:
false
true
是不是第一个比较的是两个引用的地址,
而第二个是比较两个值呢?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
•如果两个值具有相同的类型,那么就检测它们的等同性。如果这两个值完全相同,它们就相等。如果它们不完全相同,则它们不相等。
•如果两个值的类型不同,它们仍然可能相等。用下面的规则和类型转换来检测它们的相等性
•如果一个值是null,另一个值是undefined,它们相等。
•如果一个值是数字,另一个值是字符串,把字符串转换为数字,再用转换后的值进行比较。
•如果一个值为true,将它转化为1,再进行比较。如果一个值为false,把它转化为0,再进行比较。
•如果一个值是对象,另一个值是数字或字符串,将对象转换成原始类型的值,再进行比较。
第一个比较的是两个对象在堆内存中的地址 这个当然是不等的 两个对象的引用是永远不相等的         
第二个是进行值的比较

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
大哥,你it1和it2是两个不同的对象。而你的==表示:等号两边是否引用同一个对象。
而你第二个之所以为true:是因为你的 i3是int类型的,表示你比的是值。
public class lok{
    public static void main(String[] args) {
        Integer it1 = new Integer(2);
        Integer it2 = new Integer(2);
        Integer i3 =2;
        System.out.println(it1==it2);
        System.out.println(it1==i3);
    }
}
运行结果为:
false
false

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
==是比较的等号两边是否指向同一个对象
Integer it1 = new Integer(2);
        Integer it2 = new Integer(2);是new出来的两个不同对象,所以(it1==it2为false

i3==it1,而i3和it1比较时 由于integer 自动解包转化成 int数据类型
所以相当于两个同为 int类型的数据比较 而他们的值都为2,所以比较后为true。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
废话不多说。

第一个false,说明不等,是因为 new了两次

第二个true,自动拆箱,因为一个是对象,另一个是值,将对象转换成原始类型的值,再进行比较。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一个 是因为你new了两个对象所以肯定是false。
第二个 是包装类会自己拆箱进行值比较。 所以是ture。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 娇赛赛 于 2012-10-3 23:07 编辑

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 又看到你了。

查看全部评分

回复 使用道具 举报
上面说的很对
回复 使用道具 举报
这题考的有一个知识点就是JDK1.5以后出现的新特性:
就是对于基本数据类型:
自动装箱与自动拆箱的特性
Integer it = 1;自动装箱的过程。可以直接将一个基本数据类型的值赋给Integer 引用型变量,


int x = it+3;自动拆箱的过程。可以将Integer 引用型变量直接与基本数据类型进行运算。


public class Test {
    public static void main(String[] args) {
        Integer it1 = new Integer(2);
        Integer it2 = new Integer(2);
        int i3 =2;
        System.out.println(it1==it2);
        System.out.println(i3==it1);
    }
}

你第一个比较的是两个引用型变量的地址值,因为你是通过两个new出来的对象所以两个地址值肯定不相同,所以结果为false
第二个是引用型变量和基本数据类型的比较,这时候引用型变量就会自动拆箱变并与基本数据类型进行比较所以结果为true

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
曾浩 发表于 2012-10-3 21:00
•如果两个值具有相同的类型,那么就检测它们的等同性。如果这两个值完全相同,它们就相等。如果它们不完全 ...

这个答案最给劲儿
回复 使用道具 举报
Integer it1 = new Integer(2);
Integer it2 = new Integer(2);
new了两次,显然it1和it2是两个不同的对象,分别存放在两个不同的堆空间中.所以it1 == it2自然会返回false.

Integer it1 = new Integer(2);
int i3 = 2;
其实it1 == i3实例上是it1.intValue() == i3,所以当然回返true.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马