Java中关于==和equal的区别 以及equals方法重写 200

 我来答
microroom
科技发烧友

2017-07-29 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1621万
展开全部
//==与equals的默认行为都是比较引用是否相等,即是否引用了同一个对象。
//且==的行为是固定的,它总是比较引用,
//而equals的行为可以在子类中由用户重写。
//没有equal方法。下面是例子。

public class EQ
{
public static void main(String[] args)
{
//s11,s12引用了两个不同的对象,这两个对象的所有字段的值都相等
Student1 s11=new Student1("lili",'女',19);
Student1 s12=new Student1("lili",'女',19);
//s11,s13引用了一个相同的对象
Student1 s13=s11;

//这个if...else输出s11!=s12,因为==默认是比较引用,
//而s11与s12引用的是两个不同的对象
if(s11==s12)
{
System.out.println("s11==s12");
}
else
{
System.out.println("s11!=s12");
}

//这个if...else输出not s11.equals(s12),
if(s11.equals(s12))
{
System.out.println("s11.equals(s12)");
}
else
{
System.out.println("not s11.equals(s12)");
}

//这个if...else输出s11==s13,
//因为s11与s13引用的是同一个对象
if(s11==s13)
{
System.out.println("s11==s13");
}
else
{
System.out.println("s11!=s13");
}

//这个if...else输出s11.equals(s13)
if(s11.equals(s13))
{
System.out.println("s11.equals(s13)");
}
else
{
System.out.println("not s11.equals(s13)");
}

//s21,s22引用了两个不同的对象,这两个对象只有age字段的值相等
Student2 s21=new Student2("lili",'女',19);
Student2 s22=new Student2("张三",'男',19);

//这个if...else输出s11!=s12,因为==总是比较引用
if(s21==s22)
{
System.out.println("s21==s22");
}
else
{
System.out.println("s21!=s22");
}

//这个if...else输出s21.equals(s22),因为调用的是子类Student2的重写的equals方法
if(s21.equals(s22))
{
System.out.println("s21.equals(s22)");
}
else
{
System.out.println("not s21.equals(s22)");
}
}
}
class Student1
{
Student1(String n,char s,int a)
{
this.name=n;
this.sex=s;
this.age=a;
}

String name;
char sex;
int age;
}
//重写了继承自类Object的equals和hashCode方法
class Student2
{
Student2(String n,char s,int a)
{
this.name=n;
this.sex=s;
this.age=a;
}
//重写equals,如果两个Student2对象的age值相等,则它们相等
//重写此方法时,通常也必须重写hashCode方法,以维护hashCode方法的常规协定,
//该协定声明相等对象必须具有相等的哈希码。
public boolean equals(Object obj)
{
boolean r=false;

System.out.println("Student2.equals被调用!");
if(null!=obj && obj instanceof Student2)
{
r=(this.age==((Student2)obj).age);
}
return r;
}
//重写hashCode
public int hashCode()
{
return age;
}
String name;
char sex;
int age;
}
逆流寻迹
2017-07-29 · TA获得超过252个赞
知道小有建树答主
回答量:106
采纳率:0%
帮助的人:75.2万
展开全部
简单点说,==比较的是内存地址,而equals比较是的内容本身。
比如:
String s1 = "abcd"; String s2 = "abcd";
String s3 = new String("abc"); String s4 = new String("abc");
s1 == s2 和 s1.equals(s2) 以及s3.equals(s4) 均返回true,而s3 == s4返回false。
首先s1.equals(s2)与s3.equals(s4) 我相信你能理解,它们比较是两个字符串本身是否相同。而s1 == s2为什么也是返回true呢?因为字符串用String s = "";这种方式定义的时候,虽然它也是对象,但是在比较的时候它默认会调用equals方法,所以返回的结果和equals比较的结果一样都是true,最后s3 == s4比较的就真是的它们在内存中的地址,很显然是不相同的,因此是false。
然后说一下equals方法重写:
比如我定义了类Person,表示人,然后定义2个对象:
Person p1 = Person("张三"); 和 Person p2 = Person("张三");

不考虑重名的情况,假设我这里指的就是同一个人,但是我此时比较p1 == p2或者p1.equals(p2)返回的都是false,这是因为前者比较的是内存地址,结果不一样,后者比较的是HashCode,你也可以当作内存地址理解,也是不一样的。
但是假如重写equals方法:
@Override

public boolean equals(Person p) {
return this.name.equals(p.name);
}
之后再调用p1.equals(p2) 就会返回true,是想要的结果。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式