社区
Java SE
帖子详情
为什么要改写java中Object类的equals方法
beingyourself
2007-08-28 07:25:48
我的书上写的是Object中的equals方法是用于检测一个对象是否等于另外一个对象,检测的方法是判断两个对象是否具有相同的引用,如果他们具有相同的引用,他们一定是相等的。但是对于多数类来说这个判断没有什么意义,我想知道为什么这个判断对于多数类来说没有意义。书上并没有给出解释,我想请问一个高手,最好详细一些。
...全文
555
12
打赏
收藏
为什么要改写java中Object类的equals方法
我的书上写的是Object中的equals方法是用于检测一个对象是否等于另外一个对象,检测的方法是判断两个对象是否具有相同的引用,如果他们具有相同的引用,他们一定是相等的。但是对于多数类来说这个判断没有什么意义,我想知道为什么这个判断对于多数类来说没有意义。书上并没有给出解释,我想请问一个高手,最好详细一些。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
awusoft
2007-08-29
打赏
举报
回复
在有些地方会自己调用这个方法的,比如你用Vector里边的indexOf()方法时,它会调用各个对像的这个方法去比较,如果返回True,就认为这两个对像是完全相同的.
gongyali2005
2007-08-29
打赏
举报
回复
set里的对像是不重复的.就是用EQUALS来判断的.所以SET里的对像.要重写EQUALS.
beingyourself
2007-08-29
打赏
举报
回复
你们的解释我都看明白了,非常详细,谢谢大家了。
Norris_Zhang
2007-08-28
打赏
举报
回复
再补充,String被设计成不可变的,你可能会发现s1和s2指向同一个对象,那当我对s1操作时,s2不就也变了吗?这样显然是会给程序带来奇怪的bug,但是String是不可变的,当给s1="xyz"这样赋新值时,不是把"asdf"改成"xyz",而是再创建一个字符串"xyz",让s1指向它,s2还是指向"asdf"不会受影响。
但是,当一个字符串需要频繁变动时,会创建出大量没用的对象,这些对象可能会长期存在直到垃圾回收。为了避免这个问题,当我们要频繁改变一个字符串时,应该使用StringBuffer类来代替String类,当操作完成后再调用StringBuffer的toString()方法得到最后的String对象
Norris_Zhang
2007-08-28
打赏
举报
回复
String s1 = "asdf";
String s2 = "asdf";
s1 == s2 返回false, 但s1.equals(s2) 是返回true.
====================================
这个例子举得有点问题吧,呵呵。
先回答问题:
Object在的equals方法当a.equals(b);时,如果a,b指向的是同一个对象就返回true否则返回false,也就是说它比较的是内存地址,看两个引用引的是不是同一个内存地址:
Student s1=new Student();
Student s2=s1;
s1.equals(s2);//返回true
但是我们的业务中常常比较两个引用是否相等时,不是要看它们地址是否相同,如果要比较地址可以用s1==s2来比较,那么我们通常是要知道两个不同地址的对象,它们的内容是否相同,但什么叫内容相同呢?这就需要根据不同业务来定义了,Object类没办法知道什么叫相同,比如我们可能认为两个学生学号相同就是同一个学生了,那么就可以在equals()方法中比较一下学号就行了,再说一个更极端的例子,比如我完全可以定义任何的条件做为相等条件,只要业务需要,我可以定义85==90为true,因为我认为只要精确到十位相等就认为相等了。
另外说说一般的规则:我们在写equals方法时,要注意满足三个原则:
1、自等性:Student s=new Student();s.equals(s);一定要返回true;
2、反身性:s1.equals(s2)为true时要保证s2.equals(s1)也为true;
3、传递性:s1.equals(s2)为true,并且s1.equals(s3)为true,则s1.equals(s3)要为true;
找一个集成开发环境自动生成一个equals方法,研究一下生成的代码就会发现其中的一些细节。
再说说String类,先说说串池,字符串是程序中使用率非常高的类,为了提高效率,串是用“池”来管理的。
String s1="asdf";这个对象不是在堆中,而是在串池中,当再创建一个变量Sting s2="asdf";时,会先去池中找,如果有这个字符串存在,就不再新建,而是把s2也指向那个字符串,这样s1和s2就是指向同一个对象了,所以s1==s2是true;但String s3=new String("asdf");就不一样了,这是强制在堆空间创建一个对象,这时不指向串池,所以s1==s3是false;但s1.equals(s3);是true;String s4=new String("asdf");是又创建一个对象在堆空间,s3==s4也是false
snowswansaga
2007-08-28
打赏
举报
回复
equals() 只对值进行比较 不管是否指向同一空间的值
1楼的朋友的例子 返回值应该都是true
ypzhenxp
2007-08-28
打赏
举报
回复
把库存比做object
仓库号比做reference
两个仓库的库存可能一样,仓库号不一样
而我们想知道的是库存是否相同,而不是仓库号码
sszhangy
2007-08-28
打赏
举报
回复
”啊去啊老师“误写,呵呵
sszhangy
2007-08-28
打赏
举报
回复
举个简单的例子:
一个用户登录一个网站,输入用户名和密码,然后提交,在服务器生成一个对象user1,
服务器从数据库提取用户信息,也生成一个对象user2,user1和user2中用户名和密码相同。如果不修改equals()方法,两个对象必然不同(具有相同的引用,他们才是相等的),所有要修改equals()方法:
public boolean equals(Object ob){
User u=(User)ob;
if(u.userName.equals(this.userName)&&u.password.equals(this.password))return true;
else return false;
}
修改阿去啊老师equals()方法与实际的应用有关系。
zephyr_cc
2007-08-28
打赏
举报
回复
两个对象,比如两支笔,Object的equals方法是比较这两只笔是不是同一支笔.
这显然是没有任何意义的...
但是你覆盖了equals方法后,就可以让这个方法比较这两支笔是不是一个牌子,是不是一样长,是不是同一种材料..等等
Dan1980
2007-08-28
打赏
举报
回复
因为引用相等是技术层面上的相等,不是逻辑层面上的相等,与大多数应用要求不相符。比如:
Object o1 = new Object();
Object o2 = new Object();
o1和o2指向的两个对象除了存储地址不同以外,几乎是完全一样的,也就是说,逻辑上它们是完全相等的。但是o1.equals(o2)却返回false,不符合通常的应用要求。这就是为什么通常要重写equals()方法的原因。
cl55
2007-08-28
打赏
举报
回复
没有相同的引用两个OJBECT也可能相等的。
String s1 = "asdf";
String s2 = "asdf";
s1 == s2 返回false, 但s1.equals(s2) 是返回true.
java
哪些
类
重写
equals
方法
_
JAVA
------
Object
类
学习之
equals
方法
重写
我们知道
java
中
所有的
类
都有
equals
方法
,因为
Object
类
拥有
equals
方法
object
对象
中
的 public boolean
equals
(
Object
obj),指示其他某个对象是否与此对象“相等”。这里的相等指的是比较的两方指向同一个对象对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(就是同一块内存地址),此
方法
才返回 true;但是这一性质并不符合我们生活所...
Java
Object
类
及其
equals
方法
基本概念:
Object
类
位于
java
.lang包
中
,
java
.lang包包含着
Java
最基础和核心的
类
,在编译时会自动导入;
Object
类
是所有
Java
类
的祖先。每个
类
都使用
Object
作为超
类
。所有对象(包括数组)都实现这个
类
的
方法
。可以使用
类
型为
Object
的变量指向任意
类
型的对象
equals
()
方法
:比较两个对象是否同一 如果两个对象具有相同的
类
型以及相...
java
重写
object
类
下的
方法
(toString 和
equals
)
java
重写
object
类
下的
方法
(toString 和
equals
) String
类
下使用
equals
和==的区别
Java
四十八:重写
Object
类
的
equals
方法
和toString
方法
一、回顾 == 的使用: 可以使用在基本数据
类
型变量和引用数据
类
型变量
中
如果比较的是基本数据
类
型变量,比较两个变量保存的数据是否相等。(不一定
类
型要相同,char和int也可以比) 如果比较的是引用
类
型变量,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体 二、
equals
()
方法
的使用 是一个
方法
,而非运算符 只能适用于引用数据
类
型
Object
类
中
equals
()的定义: public boolean
equals
(
Object
obj ){ return
Java
J2SE / 基础
类
中
关于 为什么要
改写
java
中
Object
类
的
equals
方法
的 问题
http://community.csdn.net/Expert/topic/5732/5732870.xml?temp=6.341189E-02我的书上写的是
Object
中
的
equals
方法
是用于检测一个对象是否等于另外一个对象,检测的
方法
是判断两个对象是否具有相同的引用,如果他们具有相同的引用,他们一定是相等的。但是对于多数
类
来说这个判断没有什么意义,我想知道为什么这个判断对于多数
类
来说
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章