JAVA中==与equals的总结(二)--例子分析

本文通过具体的Java代码示例,详细解释了在Java中equals方法与==操作符的区别,包括它们在不同情况下的行为及如何正确重写equals方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Java代码 复制代码
  1. public class Person {   
  2.     String name;   
  3.     public Person(String name){   
  4.         this.name = name;   
  5.     }   
  6.     @Override  
  7.     public boolean equals(Object anObject){   
  8.         //仿照String类的equals方法来写   
  9.         if(this == anObject) return true;   
  10.         if(anObject instanceof Person){   
  11.             Person p = (Person)anObject;   
  12.             if(p.name.equals(this.name))   
  13.                 return true;   
  14.         }   
  15.         return false;   
  16.     }   
  17. }   
  18.   
  19. public class Equals==Test {   
  20.     public static void main(String[] args) {   
  21.         String str = new String("abc"); //语句(1)   
  22.         String str2 = new String("abc");//语句(2)   
  23.   
  24.         System.out.println(str == str2);//语句(3)   
  25.         System.out.println(str.equals(str2));//语句(4)   
  26.   
  27.         Object object = new Object();//语句(5)   
  28.         Object object2 = new Object();//语句(6)   
  29.   
  30.         System.out.println(object == object2);//语句(7)   
  31.         System.out.println(object.equals(object2));//语句(8)   
  32.            
  33.         Person p = new Person("zhangsan");//语句(9)   
  34.         Person p2 = new Person("zhangsan");//语句(10)   
  35.            
  36.         System.out.println(p == p2);//语句(11)   
  37.         System.out.println(p.equals(p2));//语句(12)   
  38.     }   
  39. }  
public class Person {
	String name;
	public Person(String name){
		this.name = name;
	}
	@Override
	public boolean equals(Object anObject){
		//仿照String类的equals方法来写
		if(this == anObject) return true;
		if(anObject instanceof Person){
			Person p = (Person)anObject;
			if(p.name.equals(this.name))
				return true;
		}
		return false;
	}
}

public class Equals==Test {
	public static void main(String[] args) {
		String str = new String("abc"); //语句(1)
		String str2 = new String("abc");//语句(2)

		System.out.println(str == str2);//语句(3)
		System.out.println(str.equals(str2));//语句(4)

		Object object = new Object();//语句(5)
		Object object2 = new Object();//语句(6)

		System.out.println(object == object2);//语句(7)
		System.out.println(object.equals(object2));//语句(8)
		
		Person p = new Person("zhangsan");//语句(9)
		Person p2 = new Person("zhangsan");//语句(10)
		
		System.out.println(p == p2);//语句(11)
		System.out.println(p.equals(p2));//语句(12)
	}
}


问题1:执行完语句(3)(4)打印的结果是什么?说明理由
解答:执行完语句(3)(4)打印的结果是false和true。
分析:str和str2是引用,它们指向不同的对象,内存地址不同,所以str==str2为false。我们看看String的equals方法的源码,它是对Object的equals方法的重写:

Java代码 复制代码
  1. public boolean equals(Object anObject) {   
  2.      if (this == anObject) {    return true;    }   
  3.      if (anObject instanceof String) {   
  4.          String anotherString = (String)anObject;   
  5.          int n = count;   
  6.          if (n == anotherString.count) {   
  7.              char v1[] = value;   
  8.              char v2[] = anotherString.value;   
  9.              int i = offset;   
  10.              int j = anotherString.offset;   
  11.              while (n-- != 0) {   
  12.                  if (v1[i++] != v2[j++]) return false;   
  13.              }   
  14.       return true;   
  15.         }   
  16.     }   
  17.     return false;   
   public boolean equals(Object anObject) {
        if (this == anObject) {    return true;	}
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++]) return false;
                }
	        return true;
           }
       }
       return false;
  }

注意:String类把Object类的equals方法重写了,所以它比较的确实是对象的内容。

问题2:执行完语句(7)(8)打印的结果是什么?说明理由。
解答:执行完语句(7)(8)打印的结果是false和false。
分析:object和object2是引用,它们指向不同的对象,内存地址不同,所以object==object2为false。
查看jdk的源代码,我们发现equals方法定义在Object类里面,所以所有类都有这个方法。Object类是这样定义equals方法的:

Java代码 复制代码
  1. public boolean equals(Object obj) {return (this == obj); }  
public boolean equals(Object obj) {return (this == obj); }

从这里可以看出,Object类里面的equals方法和==是等价的,它比较的也是内存地址。

问题3:执行完语句(11)(12)打印的结果是什么?说明理由。
解答:执行完语句(11)(12)打印的结果是false和false。分析:Person类没有重写Object类的equals方法。

总结:==和equals()方法有什么区别?我们不能笼统的说,equals方法比较的是内容。我们应该说"=="永远比较的是内存地址。对于equals方法,在Object类的层次上来说,它比较的是内存地址,和"=="一样。如果一个子类重写了Object类的equals方法,这个时候这个equals方法才正真比较的是内容。

要求:在自定义类的时候,如果要进行相等性的比较,必须要重写父类的equals方法。怎么重写equals方法,对于Person类 来说,如果两个Pereson的name相同,它就应该返回true,否则返回false。参见Person类的equals方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值