Java入門-Java學習路線擴展課程:equals的使用

本博客地址 | 小站坐坐 | 更多資源免費下載

       各位小夥伴,大家晚上好!今天我給大家帶來equals方法的使用,主要從兩個方面去講解:第一種,就是系統提供的類使用equals方法進行比較,另一種就是自定義類使用equals方法進行比較。希望大家喜歡。

JavaSE equals方法的使用

       我們來說說equals方法,說equals方法,我們又不得不說==,好吧!那就聽我一一說來。

1、 == 是一個比較運算符號。
2、equals方法 是Object超類的一個方法。
  • 只能比較引用數據類型。
3、equals方法的語法如下:
 public boolean equals(Object obj)
  • 比較傳進來的某個對象obj是否與此對象this“相等”,返回值爲boolean類型。
4、自定義類Student類演示案例 (沒有重寫equals方法):
package com.javaxyz.equals;

/**
 * @ClassName:Student.java
 * @Description:學生類
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:[email protected]
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:41:24
 * @Version:1.0 
 * 
 */
public class Student {
	// 屬性
	private int sid;// 編號
	private String sname;// 姓名

	// 方法
	/**
	 * @return the sid
	 */
	public int getSid() {
		return sid;
	}

	/**
	 * @param sid
	 *            the sid to set
	 */
	public void setSid(int sid) {
		this.sid = sid;
	}

	/**
	 * @return the sname
	 */
	public String getSname() {
		return sname;
	}

	/**
	 * @param sname
	 *            the sname to set
	 */
	public void setSname(String sname) {
		this.sname = sname;
	}

	/**
	 * 
	 */
	public Student() {
	
	}

	/**
	 * @param sid
	 * @param sname
	 */
	public Student(int sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}
}
5、測試類使用Junit單元測試輸出:
package com.javaxyz.test;

import org.junit.Test;

import com.javaxyz.equals.Student;

/**
 * @ClassName:TestStudent.java
 * @Description:使用Junit單元測試輸出
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:[email protected]
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:45:04
 * @Version:1.0
 */
public class TestStudent {

	@Test
	public void test() {
		// 創建對象
		Student s1 = new Student(1, "小明");
		Student s2 = new Student(1, "小明");
		// 沒有重寫equals方法之前,以下兩個打印結果都爲false,原因就是== 和 equals都是在比較對象的地址值
		System.out.println(s1 == s2); // f
		System.out.println(s1.equals(s2)); // f
    }
}    
6、控制檯輸出結果:
false
false

       比較兩個自定義的對象的地址值完全沒有意義,如果要用比較地址值,用==就OK了,何必多此一舉,來來來,我們看看Java系統類,如String類,我們來看看創建兩個對象會發生什麼事?

7、String的演示案例代碼如下:
package com.javaxyz.test;

import org.junit.Test;

import com.javaxyz.equals.Student;

/**
 * @ClassName:TestStudent.java
 * @Description:使用Junit單元測試輸出
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:[email protected]
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:45:04
 * @Version:1.0
 */
public class TestStudent {

	@Test
	public void test() {
		// 創建對象		
		String str1 = new String();
		String str2 = new String();
		System.out.println(str1 == str2);       //f
		System.out.println(str1.equals(str2)); //t
    }
}  
8、控制檯輸出結果:
false
true
9、我們來看看源碼,驚奇的發現了String重寫Object超類中的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;
}
10、於是我們來了靈感,改造Student類,重寫Object超類中的equals方法:
/**
 * 
 */
package com.javaxyz.equals;

/**
 * @ClassName:Student.java
 * @Description:學生類
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:[email protected]
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:41:24
 * @Version:1.0 重寫equals方法約定: 兩個學生對象:只要id和姓名相同,那麼我們就說是同一對象。
 * 
 */
public class Student {
	// 屬性
	private int sid;// 編號
	private String sname;// 姓名

	// 方法
	/**
	 * @return the sid
	 */
	public int getSid() {
		return sid;
	}

	/**
	 * @param sid
	 *            the sid to set
	 */
	public void setSid(int sid) {
		this.sid = sid;
	}

	/**
	 * @return the sname
	 */
	public String getSname() {
		return sname;
	}

	/**
	 * @param sname
	 *            the sname to set
	 */
	public void setSname(String sname) {
		this.sname = sname;
	}

	/**
	 * 
	 */
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param sid
	 * @param sname
	 */
	public Student(int sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + "]";
	}

	/*
	 * 重寫equals方法
	 */
	@Override
	public boolean equals(Object obj) {
		// 提高效率
		if (this == obj)
			return true;
		if (null == obj)
			return false;
		// 判斷類型是否屬於Student(注意是本對象)
		if (!(obj instanceof Student))
			return false;
		Student s = (Student) obj;// 向下轉型
		//判斷兩個屬性值是否相等,如果是數值就用==比較,如果是引用類型就用equals
		if (s.getSid() != this.getSid())
			return false;
		// 如果對象的id和姓名相等,那麼就返回true
		if (s.getSid() == this.getSid() && this.getSname().equals(s.getSname())) {
			return true;
		}
		return false;
	}
}
11、測試類使用Junit單元測試輸出:
package com.javaxyz.test;

import org.junit.Test;

import com.javaxyz.equals.Student;

/**
 * @ClassName:TestStudent.java
 * @Description:使用Junit單元測試輸出
 * @Author:DongGaoYun
 * @AuthorEnglishName:Andy
 * @URL:www.javaxyz.com 或 www.gyun.org
 * @Email:[email protected]
 * @QQ:1050968899
 * @WeiXin:QingYunJiao
 * @WeiXinGongZhongHao: JavaForum
 * @Date:2019-10-15 下午2:45:04
 * @Version:1.0
 */
public class TestStudent {

	@Test
	public void test() {
		// 創建對象
		Student s1 = new Student(1, "小明");
		Student s2 = new Student(1, "小明");
		// 沒有重寫equals方法之前,以下兩個打印結果都爲false,原因就是== 和 equals都是在比較對象的地址值
		System.out.println(s1 == s2); // f
		System.out.println(s1.equals(s2)); // f

		/*
		 * 我們先來觀察一個String類,源碼裏有這麼一段, 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; }
		 * 說明String也是重寫了equals方法,所以第一個結果爲:false 第二個結果爲true
		 * 
		 */
		String str1 = new String();
		String str2 = new String();
		System.out.println(str1 == str2);
		System.out.println(str1.equals(str2));
		
		// 改造它
		// 注意:比較兩個自定義的對象的地址值完全沒有意義,要想讓它們的比較有意義,就要給它約定一下,
		// 寫equals方法。讓它們去比較內容。也就是說只要Student類的屬性sid相等,且sname的值也相等,我們就可以說它們是同一對象,這樣我們就可以去重或做其他的業務操作,只有這樣纔有意義。
		// 重寫了equals方法之後:第一個結果爲:false 第二個結果爲true 這樣我們程序員用的纔有意義
		System.out.println(s1 == s2); // f
		System.out.println(s1.equals(s2)); // true
	}
}
12、控制檯輸出結果:
false
true

        總結:

13、"=="和“equals”的相同點:
  • 都可以做比較,返回值都是boolean
  • 在沒有重寫Object超類中的equals方法前,equals方法和 == 運行符號比較引用數據類型一樣,比較的是地址值。底層的是==號,Object超類的equals方法的源碼如下:
 public boolean equals(Object obj) {
        return (this == obj);
 }
14、“==”和“equals”的異同點:
  • == 號比較運算符號,既可以比較基本數據類型,也可以比較引用數據類型,基本數據類型比較的是值,引用數據類型比較的是地址值
  • equals方法只能比較引用數據類型,在重寫Object超類中的equals方法後,equals方法比較的是對象中的屬性值。

       小夥伴們,本文到此結束,你們都懂了嗎?記得關注、點贊、分享、評論和關注微信公衆號噢!感謝你們的支持。有疑問或好的建議請與我聯繫噢!持續更新!敬請關注!


——————— 精 選 文 章 ———————
  1. Java入門-Java學習路線課程第一課:初識JAVA
  2. Java入門-Java學習路線課程第二課:變量與數據類型
  3. Java入門-Java學習路線課程第三課:選擇結構
  4. Java入門-Java學習路線課程第四課:循環結構
  5. Java入門-Java學習路線課程第五課:一維數組
  6. Java入門-Java學習路線課程第六課:二維數組
  7. Java入門-Java學習路線課程第七課:類和對象
  8. Java入門-Java學習路線課程第八課:方法和方法重載
  9. Spring框架-Java學習路線課程第一課:Spring核心
  10. Spring框架-Java學習路線課程:Spring的擴展配置
  11. java學習:在給學生演示用Myeclipse10.7.1工具生成War時,意外報錯:SECURITY: INTEGRITY CHECK ERROR
  12. 使用jquery發送Ajax請求的幾種異步刷新方式
  13. idea Springboot啓動時內嵌tomcat報錯- An incompatible version [1.1.33] of the APR based Apache Tomcat Native

更多免費資源請關注微信公衆號:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章