Java學習心得之equals方法


一、equals方法簡介

equals方法是Object類中的一個方法,通過重寫該方法提供判斷對象是否相等的邏輯。

1.euqals用法

Dog實體類:

public class Dog {
private String color;
private int weight;
private int height;

public Dog(String color,int weight,int height){
this.color = color;
this.weight = weight;
this.height = height;
}
}


測試:
 
 public static void main(String[] args) {	        /**	         * 這里使用構造方法Dog()在堆內存里面new出了兩只狗,	         * 這兩只狗的color,weight,height都是一樣的,但是在堆內存中它們的物理地址是不一樣的。	         * 我們知道用==,equals(沒有重寫該方法),比較兩個對象時,比較的是兩個對象的地址是否一樣。	         * 因此,在這里兩只狗永遠不會相等。	         */	        Dog d1 = new Dog("black", 5,30);	        Dog d2 = new Dog("black", 5,30);	        System.out.println("d1==d2的結果是:"+(d1==d2));//false	        System.out.println("d1.equals(d2)的結果是:"+d1.equals(d2));//false	 }

2.內存分析

程序:

 Dog d1 = new Dog("black", 5,30);
 Dog d2 = new Dog("black", 5,30);

執行完之后內存如下:



我們可以看到,d1和d2指向兩個不同的地址,而==和equals(未重寫)只是比較兩個對象在內存中的地址是否一樣,因此不能准確的判斷兩個對象

是否想的(d1和d2指向同一對象時,結果返回的是true)。那么如何去比較兩個對象是否相等的呢?在現實生活中,我們比較兩只狗是否一樣,往往是通過比較

它們的屬性來判斷的,比如兩只狗的顏色、體重、身高一樣的話,我們會說這兩只狗長得一樣,同樣的道理,在Java中比較兩個對象是否相等,也可以比較兩個對象之間的屬性全部或部分相等來實現。這個時候我們可以通過重寫equals方法,來實現判斷邏輯,如下:


public class Dog {
private String color;
private int weight;
private int height;

public Dog(String color,int weight,int height){
this.color = color;
this.weight = weight;
this.height = height;
}
/**
* 這里是重寫相等從Object類繼承下來的equals()方法,改變這個方法默認的實現,
* 通過我們自己定義的實現來判斷決定兩個對象在邏輯上是否相等。
* 這里我們定義如果兩只狗的color,weight,height都相同,
* 那么我們就認為這兩只狗在邏輯上是一模一樣的,即這兩只狗是“相等”的。
*/
public boolean equals(Object obj){
if(obj==null){
return false;
}
if(obj == this){
return true;
}
if(obj instanceof Dog){
Dog d = (Dog)obj;
if(d.color.equals(this.color) && d.weight==this.weight&&d.height==this.height){
return true;
}
}
return false;
}
}

測試:

 public static void main(String[] args) {
/**
* 我們看到,同樣比較d1和d1,用equals的時候結果發生了變化
*/
Dog d1 = new Dog("black", 5,30);
Dog d2 = new Dog("black", 5,30);
System.out.println("d1==d2的結果是:"+(d1==d2));//false
System.out.println("d1.equals(d2)的結果是:"+d1.equals(d2));//true
}


3.如何比較兩個字符串是否相等

細心的朋友會發現,在上面的例子中,比較兩只狗的顏色,用的是equals方法,是的字符串的比較用的就是equals方法。那么,有人會問我們根本沒有重寫

字符串的equals方法,為什么會這樣呢?其實,在Java中String的equals,Java語言的開發者已經幫我們寫好了,當然除了String類,還有其他部分類的equals

方法也已經寫好了,有興趣的可以自己去了解。以下是String類中equals方法的源碼:

 public boolean equals(Object anObject) {
if (this == anObject) {//如果是同一個對象,返回true
return true;
}
if (anObject instanceof String) { //判斷是否是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;
}

例子:

  public static void main(String args[]){
/**
* String字面量和new出來對象比較的區別
* 下面例子中:
* 當兩個字符串都是字面量時,==和equals比較是沒有區別的,因為此時s1和s2指向的是同一個對象,在常量池中
* 當兩個字符串是new出來的時候,==和equale比較的結果是不一樣的,因為new出來的是一個新的對象,必須用equals方法比較
*
* 注意:判斷字符串之間是否相等,用equal方法,切記。
*
*/
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("s1 == s2的結果是:"+(s1 == s2));//true
System.out.println("s1.equals(s2)的結果是:"+s1.equals(s2));//true
System.out.println("s2 == s3的結果是:"+(s2 == s3));//false
System.out.println("s2.equals(s3)的結果是:"+s2.equals(s3));//true
System.out.println("s3 == s4的結果是:"+(s3 == s4));//false
System.out.println("s3.equals(s4)的結果是:"+s3.equals(s4));//true
}




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



equals(),hashcode(),克隆學習心得 我的java學習心得(1) Java學習心得08 Java學習心得02 Java學習心得01 關於Java static 的學習心得 Java學習心得10 Java學習心得06 Java學習心得03 java IO學習心得
 
粤ICP备14056181号  © 2014-2021 ITdaan.com