您当前的位置:首页 > 互联网教程

equals()方法重写

发布时间:2025-05-24 18:55:08    发布人:远客网络

equals()方法重写

一、equals()方法重写

String的equals()方法的重写是写在java.lang.String里面的,不是在这里,这里只是个示意例子,让你比较==和 equals方法的不同

=====================这是String中重写后的equals()方法

* Compares this string to the specified object. The result is{@code

* true} if and only if the argument is not{@code null} and is a{@code

* String} object that represents the same sequence of characters as this

* The object to compare this{@code String} against

*@return{@code true} if the given object represents a{@code String}

* equivalent to this string,{@code false} otherwise

*@see#equalsIgnoreCase(String)

public boolean equals(Object anObject){

if(anObject instanceof String){

String anotherString=(String)anObject;

char v2[]= anotherString.value;

============================================

如ls所说,Object类的equals方法比较的是hashCode,如果String在没有重写equals的情况下

s1.equals(s2)返回应该是false,但是事实是它返回的是true,这就是书中所说的String的equals方法已经被重写

====================为了更深刻的说明,我们来重写下你的这个例子中MyValue的equals的方法,然后你和你现在的例子比较一下就知道了

public class OperatorsAndExpressions{//操作和表达

String s1=new String("hello");

String s2=new String("hello");

System.out.println(s1.equals(s2));

class MyValue{//内部类,是用户自己定义的类因此,类MyValue的equals()方法是从

int i;//Object类继承的,其功能仍然是比较两个操作数是否是同一个对象

//为了更深刻说明重写equals方法的作用,我们来这里重写一下equals

public boolean equals(Object o){

System.out.println(v1.equals(v2));

public static void main(String[] args){

// TODO Auto-generated method stub

OperatorsAndExpressions OperAndExp=new OperatorsAndExpressions();

--------------改写后的运行结果

二、JAVA中equals的定义,用法,方法重写是怎么回事

1、如果我理解没错的话你说的应该是最初出现在Object类里的equals方法吧。

2、在这里我说一下我对这个方法的理解,仅供参考。

3、这个函数的用法是:比较[调用这个方法的对象]和[方法传递进去的参数对象]是否相等。

4、重写这个方法,意思是让你定义两个对象如何才算是相等。这样给了你极大的灵活性。因为比较两个对象是否相等是由你来定义的。这样你定义的新对象的比较也可以由你来定义。

5、假设1:现在你有一个clothes(衣服)类,有加工厂家,价格,型号三个参数。

6、假设2:你需要对比两件衣服是否是相同的,在这个比较中,加工厂家这个参数对你来说是不必要的,也就是说就算两件衣服在不同的厂家加工,可是它们价格和型号一样的情况下,你需要把它们视作同样的衣服。

7、那么:这时候你只需要在equals方法里定义比较价格和型号这两个参数,而不必去关心加工厂家这个参数。

8、具体可以翻阅帮助文档。里面写得挺好。

9、以上是我个人观点,不一定正确,仅供参考。

三、JAVA中重写equals方法为什么要重写hashcode方法说明

重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用get()取出时却产生了另外一个 hashCode()值,那么就无法重新取得该对象了。所以,如果你的hashCode()方法依赖于对象中易变的数据,那用户就要小心了,因为此数据发生变化时,hashCode()就会产生一个不同的hash码,相当于产生了一个不同的“键”。

Object的hashCode()方法,返回的是当前对象的内存地址。下次如果我们需要取一个一样的“键”对应的键值对的时候,我们就无法得到一样的 hashCode值了。因为我们后来创建的“键”对象已经不是存入HashMap中的那个内存地址的对象了。

我们看一个简单的例子,就能更加清楚的理解上面的意思。假定我们写了一个类:Person(人),我们判断一个对象“人”是否指向同一个人,只要知道这个人的身份证号一直就可以了。

先来个没有重写Code类的hashcode()的例子吧,看看是什么效果:

*身份证号码,一旦确定就不能更改

//如果地址一样,则两个对象相同

//如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;否则,说明这两个对象不相同。

publicstaticvoidmain(String[]args){

HashMap<Code,Person>map=newHashMap<Code,Person>();

Personp1=newPerson(newCode(10001),"张三");

Personp2=newPerson(newCode(10002),"李四");

System.out.println("HashMap中存放的人员信息:\n"+map);

//张三改名为张山,身份证号不变。

Personp3=newPerson(newCode(10001),"张山");

System.out.println("张三改名为张山后HashMap中存放的人员信息:\n"+map);

System.out.println("查找身份证为:10001的人员信息:"+map.get(newCode(10001)));

publicvoidsetName(Stringname){

publicPerson(Codecode,Stringname){

*重写equals()方法当两个人得身份证号相同以及姓名相同时,表示这两个人是同一个人。

booleanb=this.code.equals(p.code)&&this.name.equals(p.name);

{【身份证】:10002=【姓名】:李四,【身份证】:10001=【姓名】:张三}

张三改名为张山后 HashMap中存放的人员信息:

{【身份证】:10002=【姓名】:李四,【身份证】:10001=【姓名】:张三,【身份证】:10001=【姓名】:张山}

查找身份证为:10001的人员信息:null

我们所做的更新和查找操作都失败了。失败的原因就是我们的身份证类:Code没有覆写hashCode()方法。这个时候,当查找一样的身份证号码的键值对的时候,使用的是默认的对象的内存地址来进行定位。这样,后面的所有的身份证号对象

newCode(10001)产生的hashCode()值都是不一样的,所以导致操作失败。

重写Code类的hashcode(),代码上:

*身份证号码,一旦确定就不能更改

//如果地址一样,则两个对象相同

//如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;否则,说明这两个对象不相同。

*重写hashcode()方法,以身份证号码作为hash码。

publicstaticvoidmain(String[]args){

HashMap<Code,Person>map=newHashMap<Code,Person>();

Personp1=newPerson(newCode(10001),"张三");

Personp2=newPerson(newCode(10002),"李四");

System.out.println("HashMap中存放的人员信息:\n"+map);

//张三改名为张山,身份证号不变。

Personp3=newPerson(newCode(10001),"张山");

System.out.println("张三改名为张山后HashMap中存放的人员信息:\n"+map);

System.out.println("查找身份证为:10001的人员信息:"+map.get(newCode(10001)));

publicvoidsetName(Stringname){

publicPerson(Codecode,Stringname){

*重写equals()方法当两个人得身份证号相同以及姓名相同时,表示这两个人是同一个人。

booleanb=this.code.equals(p.code)&&this.name.equals(p.name);

{【身份证】:10001=【姓名】:张三,【身份证】:10002=【姓名】:李四}

张三改名为张山后 HashMap中存放的人员信息:

{【身份证】:10001=【姓名】:张山,【身份证】:10002=【姓名】:李四}

查找身份证为:10001的人员信息:【姓名】:张山