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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hel 中级黑马   /  2013-11-3 00:08  /  1074 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args) {
        Long lo = new Long(1);
        Integer a = new Integer(1);
        int aa = 1;
        System.out.println(lo.equals(a)); //false
        System.out.println(lo==aa); //true
      }

为什么
System.out.println(lo==aa)
会输出true

System.out.println(lo.equals(a))
则输出false

7 个回复

倒序浏览

public static void main(String[] args) {
        Long lo = new Long(1);
        Integer a = new Integer(1);
        int aa = 1;
        System.out.println(lo.equals(a));            //  API中,Long类型的equals方法的定义是Long 对象与此对象包含相同的 long 值时,结果才为 true。
        System.out.println(lo==aa);                   // Long类型和aa相比的时候,有一个自动拆箱的过程,由Long类型转为基本数据类型和aa相比,1 == 1;为true
      }


哥们加油..............

点评

还有个问题: 为什么lo==a会报“不可比较的类型”的错误?“==”对于引用数据类型,不是比较地址值的吗?  发表于 2013-11-4 14:46
问您个问题: 为什么Long类型和aa相比,不是aa自动装箱,而是lo自动拆箱呢?Long类型的自动拆箱用了Long中的哪个方法?是intValue()吗?  发表于 2013-11-4 14:43

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 狼人→浪人 于 2013-11-4 00:36 编辑

equals(Object obj)将此对象与指定对象进行比较。当且仅当该参数不是 null,且 Long 对象与此对象包含相同的 long 值时,结果才为 true。
回复 使用道具 举报
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true。
而你“lo==aa”时,因为long的容量大于int,所以在进行运算时int会自动转换成long类型,所以结果为true。
回复 使用道具 举报
你的这个问题其实是涉及到equals  和 == 的区别

首先你要知道,equals方法是从object类中继承过来的,在object类中equals方法比较的是两个对象的哈希值(或者地址值),也就是说,在Object类中的时候,equals的功能等于==,但是当Object类被继承复写之后,就拿你这个例子来说,Long这个类中的equals方法被重写了,也就是说,在Long类中,equals用来比较两个值是否相等了,而不是比较两个对象的地址是否相同了。

具体的代码是怎样的我没看源码,反正道理是这样的。

点评

lo和a两个是不同类型啊,一个是long类型,一个是integer类型。  发表于 2013-11-4 19:10
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马