简单总结为:
1、“==”:代表比较双方是否相同。如果是基本数据类型则表示相等,如果是引用数据类型则表示地址相等即是同一个对象。
public class TestEquals {
public static void main(String[] args){
User u1 = new User(2018,"小红","12345");
User u2 = new User(2018,"小明","12345");
System.out.println(u1==u2);
User u3 = u1;
System.out.println(u1==u3);
}
}
class User{
int id;
String name;
String pwd;
public User(int id,String name,String pwd){
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
}
//output:
//false
//true
2、equals:Object类中定义的public booiean equals(Object obj)方法,提供定义”对像内容相等“的逻辑。
(1)Object类中,equals方法也是基于“==”定义,原码如下,
public boolean equals(Object obj) {
return (this == obj);
}
如果子类不改写equals方法,则也只能用于判断基本数据类型是否相同或者判断引用数据类型的地址是否相同(即是否为同一对象)。
(2)大多数类都会对equals方法进行重写,达到的目的是:用于判断两个对象(地址不同)的内容是否一样,例如String类,原码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
String类的equals方法达到的效果是,同一个对象(即相同地址)返回true、 同一个类产生的不同对象,两个对象的内容一样也返回true。
即equals方法主要增加了“判断内容是否相同”这一环节。
补充举例:改写equals方法,如下:
public class TestEquals { public static void main(String[] args){ User u1 = new User(2018,"小红","12345"); User u2 = new User(2018,"小明","12345"); User u3 = new User(2019,"小亮","12345"); System.out.println(u1==u2); System.out.println(u1.equals(u2)); System.out.println(u1.equals(u3)); } } class User{ int id; String name; String pwd; public User(int id,String name,String pwd){ super(); this.id = id; this.name = name; this.pwd = pwd; } public boolean equals(Object obj){ if (this == obj){ return true; } if (obj instanceof User){ User u = (User)obj; if (this.id==u.id){ //判断的内容仅仅是id属性 return true; } } return false; } } /*output: false true false */