黑马程序员技术交流社区

标题: 为什么字节码之间的比较用==笔equals好? [打印本页]

作者: gerenvip    时间: 2013-4-27 13:03
标题: 为什么字节码之间的比较用==笔equals好?
本帖最后由 gerenvip 于 2013-4-27 19:29 编辑

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


作者: 袁梦希    时间: 2013-4-27 13:28
本帖最后由 袁梦希 于 2013-4-27 13:30 编辑

楼主你好,

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


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

作者: 吴波    时间: 2013-4-27 13:37
虽然返回值都是true或false,但
==:比较的是地址值
equals:比较的是引用变量的内容
作者: harborbest    时间: 2013-4-27 13:39
==    是比较两个对象的地址是否相同 也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Person p= new Person();变量p是一个内存,new Person();是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals是用于比较两个独立对象的内容是否相同。
反射中获取到的字节码文件时相同的。就不会涉及到对象占用内存问题。





作者: 侯天进    时间: 2013-4-27 13:54
字节码本身就是唯一的它是一个二进制码,==比较地址值,而equals比较的是内容,所以用==比。
作者: gerenvip    时间: 2013-4-27 14:13
袁梦希 发表于 2013-4-27 13:28
楼主你好,

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

不是吧?==比较的是引用变量的地址值,而equals比较的是引用的对象的地址值,也就是比较引用对象是否相同。
作者: 袁梦希    时间: 2013-4-27 14:16
gerenvip 发表于 2013-4-27 14:13
不是吧?==比较的是引用变量的地址值,而equals比较的是引用的对象的地址值,也就是比较引用对象是否相同 ...

==比较的是引用变量的地址值,就不能比较字节码了吗?一般“==”号是比较数据或内容上的是否相同,而equals比较的是对象上的是否相同!希望楼主能明白。
作者: gerenvip    时间: 2013-4-27 14:24
本帖最后由 gerenvip 于 2013-4-27 14:37 编辑

我明白啦!谢谢啦!果然是使用==比equals高明一些,这样一来说明页知道内存内部的情况啦

作者: Miss小强    时间: 2013-4-27 18:35
个人观点:
==是直接双方PK
而equals是调用第三方的方法(Object)
自己家的事自己解决,为什么要请第三方呢???
作者: 言耶和华之所言    时间: 2013-8-16 16:09
袁梦希 发表于 2013-4-27 13:28
楼主你好,

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

这位大哥废了半天劲给人家正好说反了{:soso_e140:}

作者: 言耶和华之所言    时间: 2013-8-16 16:32
equals在比较时实际上是比较两个对象的hashCode()方法的返回值,虽然hashCode()默认返回值是根据地址值计算的,但是hashCode()方法原则上要重写,返回值以成员变量的哈希码来计算。所以equals方法虽然也行,但是是根据内容算出来的相同,如果凑巧的话不同的两个对象也有可能返回true。
==不仅比较的是具有唯一性的地址值,并且是只能同类型比较。综上==胜!!
作者: 1007087594    时间: 2014-5-31 08:23
好吧,我跟上面的那些大神一样,我还是路过吧
作者: viviwen    时间: 2014-12-30 11:42
让我下东西啊。让我下吧。
作者: 李票    时间: 2014-12-31 21:54
equals是object类中的两个对象比较的一种方法,对象强调的是含有变量和方法,而字节码文件只含有一些变量内容,==比较的是变量内容,当然比较好啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2