- object中的equals方法的底层主要中的
==
实现
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
}
==
的两边若是引用类型,则比较的是两者的内存地址,内存地址一致则为true,反之为false- object中的equals方法自然也是比较引用的内存地址,这样设计的目的是判断两对象是否为同一个
- java中两字符串的比较必须用equals,不能用
==
- 现实的业务逻辑中,应该比较对象的内容,比如用户对象,如果用户的姓名和密码相同,就应该返回true,认为是同一个对象,所以,这是就应该重写equals方法
public class EqualsTest {
public static void main(String[] args){
EqualsTest elt=new EqualsTest();
elt.test02();
}
public void test01(){
User u1=new User("chen","123");
User u2=new User("chen","123");
System.out.println(u1==u2);//false,开辟了两块内存,它们的内存地址当然不一样,虽然表面上看他们的内容一样
System.out.println(u1.equals(u2));//重写后为true,重写前为false
if(u1.equals(u2)){//没重写时这里的equals和==的效果是一样的,因为equals的底层就是'=='实现的
System.out.println("对象u1和u2在内存中的地址一样,两者是一个对象");
System.out.println("u1="+u1);
System.out.println("u2="+u2);
}else{
System.out.println("虽然两个对象的内容一致,但其内存地址不一样,不是同一个对象");
System.out.println("u1="+u1);
System.out.println("u2="+u2);
}
}
public void test02(){
User u=new User("chen","123");
User u1=u;
System.out.println(u.equals(u1));
if(u1.equals(u)){//true
System.out.println("u1与u的内存地址一致,指向堆中同一个对象");
System.out.println("u1="+u1);
System.out.println("u="+u);//完全一致
}else{
System.out.println("两者地址不一致,不是同一个对象");
}
}
}
class User{
String name;
String password;
User(String name,String password){
this.name=name;
this.password=password;
}
/*java中equals的实现源码
* public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
* */
//Object中的equals比较的是内存地址是否一致,判断两对象是否为同一个
//但在实际的业务需求中,这样肯定是不够的,应该比较对象的内容是否相同,
//比如这个user类中,只要用户名和密码相同,我们就认为两个对象是相等的
//因此,要重写equals方法
public boolean equals(Object o){
if(this==o){//内存地址相同时,两对象相等
return true;
}
if(o instanceof User){//内容相同时两对象也相等的
User u=(User)o;
if((u.name).equals(this.name)&&(u.password).equals(this.password)){
return true;
}
}
return false;
}
}