equals()方法与“==”的区别
Posted yushaolin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了equals()方法与“==”的区别相关的知识,希望对你有一定的参考价值。
首先我们来上手一段代码:
public class Studnet { String name; public Studnet(String name){ this.name=name; } public static void main(String[] args) { Studnet studnet1=new Studnet("张三"); Studnet studnet2=new Studnet("张三"); System.out.println(studnet1==studnet2);//false System.out.println(studnet1.equals(studnet2));//false } }
在上面的这段代码当中,我们创建了两个student对象,分别student1和student2分别是两个对象的引用。下面我们来对“==”和equals进行分析:
在“student1==student2”当中:是直接比较两个对象的引用,我们不难判断出,因为两者指向的对象分别位于不同的存储空间,所以student1和student2指向的地址也不一样,故而student1与student2是永远不相等的,如若比较两个对象是否相等,是比较的是对象里面的内容是否一致。总结如下:
要想判断两个对象是否相等,不能通过比较两个对象的引用是否相等,这是永远都得不到相等的结果的,因为两个对象的引用永远不会相等,所以正确的比较方法是直接比较这两个对象,比较这两个对象的实质是不是一样的,即这两个对象里面的内容是不是相同的,通过比较这两个对象的属性值是否相同而决定这两个对象是否相等。
因为默认的equals()方法里面比较的是两个引用是否指向同一对象,所以在上述代码中,两种比较实际是一样的。解决办法是在Student类里面重写equals()方法,代码如下:
@Override public boolean equals(Object obj) { // TODO 自动生成的方法存根 if (obj==null) { return false; }else{ if (obj instanceof Studnet) { Studnet studnet=(Studnet) obj; if (((Studnet) obj).name==this.name) { return true; } } } return false; }
再执行上述代码:
public class Studnet { String name; public Studnet(String name){ this.name=name; } public static void main(String[] args) { Studnet studnet1=new Studnet("张三"); Studnet studnet2=new Studnet("张三"); System.out.println(studnet1==studnet2);//false System.out.println(studnet1.equals(studnet2));//true } }
以上是关于equals()方法与“==”的区别的主要内容,如果未能解决你的问题,请参考以下文章