各位小夥伴,大家晚上好!今天我給大家帶來equals方法的使用,主要從兩個方面去講解:第一種,就是系統提供的類使用equals方法進行比較,另一種就是自定義類使用equals方法進行比較。希望大家喜歡。
文章目錄
- 我們來說說equals方法,說equals方法,我們又不得不說==,好吧!那就聽我一一說來。
- 1、 == 是一個比較運算符號。
- 2、equals方法 是Object超類的一個方法。
- 3、equals方法的語法如下:
- 4、自定義類Student類演示案例 (沒有重寫equals方法):
- 5、測試類使用Junit單元測試輸出:
- 6、控制檯輸出結果:
- 比較兩個自定義的對象的地址值完全沒有意義,如果要用比較地址值,用==就OK了,何必多此一舉,來來來,我們看看Java系統類,如String類,我們來看看創建兩個對象會發生什麼事?
- 7、String的演示案例代碼如下:
- 8、控制檯輸出結果:
- 9、我們來看看源碼,驚奇的發現了String重寫Object超類中的equals方法。原來如此,小夥伴們是不是有種豁然開朗的感覺?源碼如下:
- 10、於是我們來了靈感,改造Student類,重寫Object超類中的equals方法:
- 11、測試類使用Junit單元測試輸出:
- 12、控制檯輸出結果:
- 總結:
- 小夥伴們,本文到此結束,你們都懂了嗎?記得關注、點贊、分享、評論和關注微信公衆號噢!感謝你們的支持。有疑問或好的建議請與我聯繫噢!持續更新!敬請關注!
我們來說說equals方法,說equals方法,我們又不得不說==,好吧!那就聽我一一說來。
1、 == 是一個比較運算符號。
-
既可以比較基本數據類型(不熟悉基本數據的小夥伴點擊:Java入門-Java學習路線課程第二課:變量與數據類型 的 java常用的數據類型:),也可以比較引用數據類型(不熟悉引用數據類型的小夥伴點擊:Java入門-Java學習路線課程第二課:變量與數據類型 的 java常用的數據類型:)。
-
注意:基本數據類型比較的是值,引用數據類型比較的是地址值
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方法比較的是對象中的屬性值。
小夥伴們,本文到此結束,你們都懂了嗎?記得關注、點贊、分享、評論和關注微信公衆號噢!感謝你們的支持。有疑問或好的建議請與我聯繫噢!持續更新!敬請關注!
- Java入門-Java學習路線課程第一課:初識JAVA
- Java入門-Java學習路線課程第二課:變量與數據類型
- Java入門-Java學習路線課程第三課:選擇結構
- Java入門-Java學習路線課程第四課:循環結構
- Java入門-Java學習路線課程第五課:一維數組
- Java入門-Java學習路線課程第六課:二維數組
- Java入門-Java學習路線課程第七課:類和對象
- Java入門-Java學習路線課程第八課:方法和方法重載
- Spring框架-Java學習路線課程第一課:Spring核心
- Spring框架-Java學習路線課程:Spring的擴展配置
- java學習:在給學生演示用Myeclipse10.7.1工具生成War時,意外報錯:SECURITY: INTEGRITY CHECK ERROR
- 使用jquery發送Ajax請求的幾種異步刷新方式
- idea Springboot啓動時內嵌tomcat報錯- An incompatible version [1.1.33] of the APR based Apache Tomcat Native