很多時候我們都需要對兩個變數進行比較,判斷它們是否相等。不用性質的變數的比較方法會有所不同,其比較的含義也不盡相同,本文將討論一下基本資料型別變數、引用變數和物件變數的比較方法和意義。
一、primitive基本資料型別比較
用==比較基本資料型別的變數,當變數的值相等時,則認為這兩個變數相等。即使是不同型別的變數,只要它們的值相等,就認為它們相等。
int a = 1;
int b = 2;
float c = 1.0f;
boolean result1 = (a == b);//false
boolean result2 = (a == c);//true
二、引用比較
用==比較兩個引用是否指向堆上的同乙個物件。其實引用也是個變數值,只是這個值是取得特定物件的位表示法,可以模擬成這個物件的訪問位址。用==比較兩個引用其實就是判斷這兩個引用是不是指向記憶體裡的同乙個東西。
public class person
public string getname()
public void setname(string name)
public int getage()
public void setage(int age)
}person p1 = new person("p1",20);
person p2 = new person("p1",20);
person p3 = p1;
boolean result3 = (p1 == p2);//false
boolean result4 = (p1 == p3);//true
三、物件的比較
用equals()方法比較兩個物件在某種意義上是否相等。在沒有重寫equals()方法的預設情況下,比較的依然是這兩個物件是不是堆上的同乙個物件。
person p1 = new person("p1",20);
person p2 = new person("p1",20);
person p3 = p1;
boolean result5 = (p1.equals(p2));//false
boolean result6 = (p1.equals(p3));//true
但很多情況下,我們是想比較兩個物件是否具有相同的屬性,而就此判斷它們是不是相等,此時就需要重寫equals()方法。
@override
public boolean equals(object obj)
if(this == obj)
if(obj instanceof person)else
}else
}person p1 = new person("p1",20);
person p2 = new person("p1",20);
person p3 = p1;
person p4 = new person("p4",20);
boolean result7 = (p1.equals(null));//false,在1處返回
boolean result8 = (p1.equals(p3));//true,在2處返回
boolean result9 = (p1.equals(p2));//true,在3處返回
boolean result10 = (p1.equals(p4));//false,在4處返回
boolean result11 = (p1.equals(new integer(1)));//false,在5處返回
至此,物件的比較已基本完成。但是,我們需要注意到:如果以我們重寫的規則來判斷兩個物件是相等的,那麼這兩個物件就應該滿足某些操作規則,例如在hashset中就不應該出現兩個重複的物件,而hashset判斷兩個物件是否重複不僅需要呼叫equals()方法,同時還會呼叫hashcode()方法以判斷兩個物件的hashcode是否相等。因此,我們在重寫了equals()方法同時,也應該重寫hashcode()方法,以使得相等的兩個物件具有相同的hashcode。
@override
public int hashcode()
hashcode是物件的int型的雜湊碼,用於支援雜湊機制的集合類操作,通常是根據物件的位址或字元或數值計算得到的,大多數情況下不同物件的hashcode是不相等的,但也有巧合的情況是相等的,此時就不能直接認為兩個物件也相等。
結論:(1)重新了equals()方法的同時也應該重新hashcode()方法,即符合「相等的兩個物件具有相同的hashcode」;(2)hashcode相等並不意味著兩個物件是相等。
shell變數 比較
記錄下來,不常用就會忘 注意 這裡的空格很重要。要確保方括號的空格,前後都要有。if then elif then else fi f somefile 判斷是否是乙個檔案 x bin ls 判斷 bin ls是否存在並有可執行許可權 n var 判斷 var變數是否有值 a b 判斷 a和 b是否...
java 集合比較
collection 單列集合 list 有序,可重複 arraylist 底層資料結構是陣列,查詢快,增刪慢 執行緒不安全,效率高 vector 底層資料結構是陣列,查詢快,增刪慢 執行緒安全,效率低 linkedlist 底層資料結構是鍊錶,查詢慢,增刪快 執行緒不安全,效率高 set 無序,唯...
Java日期比較
在進行業務處理時,遇到乙個需要比較日期但是不包含時分秒的判斷問題 dateformat f new dateformat yyyy mm dd if f.parse f.format user.getexpirydate before f.parse f.format new date 1 f.fo...