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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gerenvip 中级黑马   /  2013-4-27 13:03  /  2921 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 gerenvip 于 2013-4-27 19:29 编辑

请高手详细分析一下,为什么字节码之间的比较用“==”比“equals”好呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

13 个回复

正序浏览
李票 中级黑马 2014-12-31 21:54:30
14#
equals是object类中的两个对象比较的一种方法,对象强调的是含有变量和方法,而字节码文件只含有一些变量内容,==比较的是变量内容,当然比较好啦
回复 使用道具 举报
让我下东西啊。让我下吧。
回复 使用道具 举报
好吧,我跟上面的那些大神一样,我还是路过吧
回复 使用道具 举报
equals在比较时实际上是比较两个对象的hashCode()方法的返回值,虽然hashCode()默认返回值是根据地址值计算的,但是hashCode()方法原则上要重写,返回值以成员变量的哈希码来计算。所以equals方法虽然也行,但是是根据内容算出来的相同,如果凑巧的话不同的两个对象也有可能返回true。
==不仅比较的是具有唯一性的地址值,并且是只能同类型比较。综上==胜!!
回复 使用道具 举报
袁梦希 发表于 2013-4-27 13:28
楼主你好,

       你肯定是看到张孝祥老师讲到的反射那了,老张讲的也是模模糊糊,他就说了字节码文件的 ...

这位大哥废了半天劲给人家正好说反了{:soso_e140:}
回复 使用道具 举报
个人观点:
==是直接双方PK
而equals是调用第三方的方法(Object)
自己家的事自己解决,为什么要请第三方呢???
回复 使用道具 举报
本帖最后由 gerenvip 于 2013-4-27 14:37 编辑

我明白啦!谢谢啦!果然是使用==比equals高明一些,这样一来说明页知道内存内部的情况啦
回复 使用道具 举报
gerenvip 发表于 2013-4-27 14:13
不是吧?==比较的是引用变量的地址值,而equals比较的是引用的对象的地址值,也就是比较引用对象是否相同 ...

==比较的是引用变量的地址值,就不能比较字节码了吗?一般“==”号是比较数据或内容上的是否相同,而equals比较的是对象上的是否相同!希望楼主能明白。
回复 使用道具 举报
袁梦希 发表于 2013-4-27 13:28
楼主你好,

       你肯定是看到张孝祥老师讲到的反射那了,老张讲的也是模模糊糊,他就说了字节码文件的 ...

不是吧?==比较的是引用变量的地址值,而equals比较的是引用的对象的地址值,也就是比较引用对象是否相同。
回复 使用道具 举报 1 0
字节码本身就是唯一的它是一个二进制码,==比较地址值,而equals比较的是内容,所以用==比。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
==    是比较两个对象的地址是否相同 也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Person p= new Person();变量p是一个内存,new Person();是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals是用于比较两个独立对象的内容是否相同。
反射中获取到的字节码文件时相同的。就不会涉及到对象占用内存问题。




评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
虽然返回值都是true或false,但
==:比较的是地址值
equals:比较的是引用变量的内容

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁梦希 于 2013-4-27 13:30 编辑

楼主你好,

       你肯定是看到张孝祥老师讲到的反射那了,老张讲的也是模模糊糊,他就说了字节码文件的比较如果用“==”别人看见你肯定是高手,
如果用equals比较,别人一看你就是菜鸟,原因是


因为字节码在内存中具有唯一性,因为两个字节码就是两个对象,两个对象就是两个内存地址值,equals方法就是比较内存地址值的,你拿两个内存地址值不同的字节码对象进行比较,那么没意义,肯定是false。如果用双等号才能证明两个字节码的内容是否真正相同,这里强调的是内容,因为他比较的是二进制的文件的内容。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马