Java中关于==和equal的区别 以及equals方法重写 200
2个回答
展开全部
//==与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;
}
//且==的行为是固定的,它总是比较引用,
//而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;
}
展开全部
简单点说,==比较的是内存地址,而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,是想要的结果。
比如:
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,是想要的结果。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询