關於java的equals和==簡要區分

1.==比較雙方是否相同,
a.當比較的對象爲基礎類型時,如果值相等,則返回true,否則爲false;
b.當比較的對象爲引用類型時,比較的是引用類型的(對象的)地址,如果兩個地址相同(即爲同一個對象)則返回true,否則爲false;

2.equals比較雙方是否相同,
a.首先,equals方法在Object基類中已經定義並實現,其比較的是兩個對象d的hashcode(指向的地址)是否相同,如果相同則返回ture,否則爲false。
b.一般來說,正常的默認繼承Object類,則該類的equals功能和Object是一樣的,但是由於各種特定意義,Object的equals的比對方式不能夠滿足比對需求,所以可能需要我們重寫equals方法,而java中的String類就重寫了Object類的equals方法。
c.String類的equals比對的是,兩個字符串內容(value屬性)的字符序列是否等,如果相同則返回ture,反之爲false。

舉一個爲什麼要重寫equals的例子:張三在101班是學生張三,現在,他轉到102班之後改名叫張四。作爲學生類來說他們是同一個人,我們判斷的標準是身份證號【或者是學號(前提學號不變)】。這時候,學生類的equals方法比對時,就不能比對地址了。而是他們的身份證號,這個是唯一不變的。

代碼說明:

	public static void main(String[] args) {
		
		Object obj1 = new Object();
		Object obj2 = new Object();
		System.out.println(obj1 == obj2);//false,地址不一樣不是同一個對象
		System.out.println(obj1.equals(obj2));//false,Object比較的是兩個對象的地址
		
		Person2 person = new Person2("張三",11,1);
		Person2 person2 = new Person2("小張",11,1);
		System.out.println(person == person2);//false,不是同一個對象,但是業務意義上是同一個人,所以需要改寫equals
		System.out.println(person.equals(person2));//true,id相同,則認爲兩個人對象內容相同
		
		String s1 = new String("李四");
		String s2 = new String("李四");
		System.out.println(s1==s2);//false,兩個字符串不是同一個對象
		System.out.println(s1.equals(s2));//true,兩個字符串內容相同,因爲String類改寫了Object的equals方法,以內容是否相同爲最終標準

	}
	
class Person2{
	int id;
	String name;
	int age;
	
	public Person2() {};
	public Person2(String name,int age,int id) {
		this.age = age;
		this.name = name;
		this.id = id;
	}
	
	public boolean equals(Object obj) {//重寫equals方法
		if(obj == null) {
			return false;
		}else{
			if(obj instanceof Person2) {
				Person2 c = (Person2) obj;
				if(c.id == this.id) {
					return true;
				}
			}
		}
		return false;
	}
	public String toString() {
		return name+",age:"+age;
	}

輸出結果:
false
false
false
true
false
true

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