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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 终结者 中级黑马   /  2013-10-15 23:19  /  1771 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中怎么区别==和equals

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 这种简单的问题,到百度上很容易就搜到。.

查看全部评分

8 个回复

倒序浏览
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变
    量所对应的内存中所存储的数值是否相同,要比较两个基本类型
    的数据或两个引用变量是否相等,只能用==操作符。
而equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
==比较的是地址值是否相等
而equals比较的是两个内容师傅相等    如果类中没有重写equals方法就会调用object类中的equals方法进行比较

评分

参与人数 1黑马币 +6 收起 理由
狼王 + 6 赞一个!

查看全部评分

回复 使用道具 举报
equals在Object中,但是多数是被其它的子类或实现类重写,也各自定义的自己 特有的比较方法,所以具体说它比较什么是不一定的,但是“==”是如整数之类的数进行比较,当然,刚开始,你可以认为equals是比较内存地址值,也就是哈希值,但是要明确的是,equal可以被重写,你也可以重写一个equals方法来使其具有特有的比较方式。

评分

参与人数 1黑马币 +6 收起 理由
狼王 + 6 赞一个!

查看全部评分

回复 使用道具 举报
==比较的是内存地址值,比如说有两个对象
Person p1 = new Person();
Person p2 =  new Person();
用==操作p1和p2, p1 == p2 实际比较的就是 p1和p2这两个引用指向的堆内存中的实例对象的地址

而Object的equals也是比较的内存地址值,因为equals方法内部就是使用了==操作符
对于Object的子类来说,如String类,它复写了Object的equals方法,使equals的功能变成了比较字符串的内容,
对于我们自己定义的类,要存入集合的话,要复写equals使他可以用以比较对象的内容而不是地址值,从而保证存入集合的元素的唯一性
在ArrayList中,equals也用以去除重复元素
回复 使用道具 举报
它们两个的区别是一个是运算符,一个是方法。
== 是比较运算符,比较的的是内存地址,一般用来做基本数据类型的比较
equals 方法比较灵活,在类里面可以重写,可以比较基本数据类型,也可以用来比较自定义对象,通过重写equals方法就可以实现各种各样的比较。比如String就重写了equals方法,比较字符串的内容而不是内存地址。比如你定义一个Person类,里面有id和name属性,你重写equals方法,设置只要id相等或者name相等两者equals结果既为真。那么这两个属性只要有一个为真它们的equals结果即为真。
==运算符作用是死的,就是比较内存地址
equals作用灵活,可以进行重写,重新定义比较,比如在Set集合中就要求重写equals和toString方法,以便设置自定义对象的比较规则和显示方式。

评分

参与人数 1技术分 +2 收起 理由
黄文伯 + 2 赞一个!

查看全部评分

回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。
       基本数据类型在"栈"中存的是其内容值,而对象类型在"栈"中存的是地址,这些地址指向"堆"中的对象。
       java.lang包中的Object类有public boolean equals(Object obj)方法,它比较两个对象是否相等。
       其它对象的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。
       总之,"=="和"!="比较的是地址.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.或者说,,"=="和"!="比较的是"栈"中的内容,而equals()比较的是"堆"中的内容.
回复 使用道具 举报
  ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
  如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = newObject();变量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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
回复 使用道具 举报
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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。

字符串的比较基本上都是使用equals方法。

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

boolean equals(Object o){

return this==o;

}

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