黑马程序员技术交流社区

标题: ==这个符号,它是怎么样做判断的。 [打印本页]

作者: 王渠    时间: 2012-8-3 13:22
标题: ==这个符号,它是怎么样做判断的。
其实是想知道==在代码层是怎么样实现它的判断功能的。
像Object类equals方法中首先对两个对象用==进行了比较。
又因为大家都说的==判断的是地址值,所以就开始怀疑,==难道可以等效于调用系统的哈希算法。
来计算两个对象的哈希值是否相同,再给出答案。
不知道表达清楚了没有,就是想问==是怎么样被实现的。

作者: 尤洋    时间: 2012-8-3 15:11
个人感觉 就是 判断引用变量对应的 地址 是否指向同一个对象,
是同一个对象就为true,不是同一个对象的话,哪怕值相等 也依然是false。

用个不恰当的例子来讲 也就是将两者的 地址的值拿出来 进行 equals 比较。

纯属个人看法,同样希望有高手来讲解下
作者: 焦晨光    时间: 2012-8-3 16:03
==两边的对象属于基本类型是,==的作用仅是比较对象的值是否相等
==两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否一致

00.JPG (34.62 KB, 下载次数: 16)

00.JPG

作者: 韩爽    时间: 2012-8-3 16:28
本帖最后由 韩爽 于 2012-8-4 13:26 编辑

==是比较的是2个对象的地址,而equals比较的是2个对象的内容。
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

  • String a=new String("aaa");
  • String b=new String("aaa");

复制代码

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

  • boolean equals(Object o){
  • return this==o;
  • }

复制代码

这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。


作者: 胡文凡    时间: 2012-8-3 16:45
==就是表示两个对象是同一个了,内存地址相同,差不多就可以理解为同一个了。
作者: 于启会    时间: 2012-8-3 18:48
java中有值类型传递和引用类型传递,值类型传递有8中基本类型(byte   short    int   long  double  float  boolean  char),出了8中基本类型传递的都是引用类型传递
基本类型存在在栈中    指向栈中值的连接地址
引用类型存在于堆中    是在内存中开辟一块空间,然后变量名指向它
==   是比较对象的值是否相等
equals  是比较的对象的地址是否相等
作者: 官文昌    时间: 2012-8-3 18:59
本帖最后由 官文昌 于 2012-8-3 19:01 编辑

   这是张孝祥老师的笔记回答:希望对你有帮助~~~~

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

     equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

     String a=new String("foo");

     String b=new String("foo");

     两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

     在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。

     如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

     boolean equals(Object o){

     return this==o;

}

     这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

作者: 芒果控    时间: 2012-8-4 16:48
呵呵,2楼其实已经说得很简洁了,这个是JAVA有两种比较方式而已,而c#的==就是equals
作者: 瞿乐    时间: 2012-8-4 22:56
简而言之,==是比较的地址。  楼主记得使用的时候,写的类需要比较的话,一般都会重写equals 方法,因为Object 的equals方法也是比较的地址(即用==比较)。在以后开发过程用比较内容的话一定会重写equals方法的。
作者: 刘悦    时间: 2012-8-5 10:34
焦晨光 发表于 2012-8-3 16:03
==两边的对象属于基本类型是,==的作用仅是比较对象的值是否相等
==两边的对象属于引用数据类型时,==的作 ...

这图文并茂绝对给力!




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