==用法java
1.比較基本數據類型,若是兩個值相同,則結果爲trueide
2.比較引用時,若是引用指向內存中的同一對象,結果爲true函數
equals()用法this
函數原型:public boolean equals(Object obj)spa
1.當參數obj引用的對象與當前對象爲同一個對象時,就返回true,不然返回false3d
既然是二者有一樣的做用,爲何還要弄出一個equals()方法來呢。由於==運算符不容許咱們進行覆蓋,也就是說它限制了咱們的表達。code
示例:對象
1 /** 2 * @author xiaoyuer 3 * 4 */ 5 public class Students 6 { 7 private int age; 8 private String name; 9 10 public Students (int age,String name) 11 { 12 this.age = age; 13 this.name = name; 14 } 15 16 public int getAge() { 17 return age; 18 } 19 20 public void setAge(int age) { 21 this.age = age; 22 } 23 24 public String getName() { 25 return name; 26 } 27 28 public void setName(String name) { 29 this.name = name; 30 } 31 } 32 33 class EqualTest 34 { 35 public static void main(String args[]) 36 { 37 Students e1 = new Students (18,"張三"); 38 Students e2 = new Students (18,"張三"); 39 40 System.out.println(e1 == e2); 41 System.out.println(e1.equals(e2)); 42 } 43 } 44 equals使用
運行結果:blog
false內存
false
結果說明:使用"=="號跟使用equals()方法結果都爲false,說明equals()函數的本意爲肯定兩個對象的引用是否相同
JDK提供了覆蓋機制:
而JDK類中有一些類覆蓋了oject類的equals()方法,比較規則爲:若是兩個對象的類型一致,而且內容一致,則返回true,這些類有:
java.io.file,java.util.Date,java.lang.string,包裝類(Integer,Double等)
示例:
1 class EqualTest 2 { 3 public static void main(String args[]) 4 { 5 String e1=new String("aaa"); 6 String e2=new String("aaa"); 7 8 System.out.println(e1 == e2); 9 System.out.println(e1.equals(e2)); 10 } 11 }
運行結果:
false
true
結果說明:在String中equals()方法被進行了覆蓋,使其意義變爲比較兩個對象的內容是否一致
拓展提高:複寫equals()方法,實現比較其餘內容
咱們還應該注意,Java語言對equals()的要求以下,這些要求是必須遵循的:
• 對稱性:若是x.equals(y)返回是「true」,那麼y.equals(x)也應該返回是「true」。
• 反射性:x.equals(x)必須返回是「true」。
• 類推性:若是x.equals(y)返回是「true」,並且y.equals(z)返回是「true」,那麼z.equals(x)也應該返回是「true」。
• 還有一致性:若是x.equals(y)返回是「true」,只要x和y內容一直不變,無論你重複x.equals(y)多少次,返回都是「true」。
• 任何狀況下,x.equals(null),永遠返回是「false」;x.equals(和x不一樣類型的對象)永遠返回是「false」。
以上這五點是重寫equals()方法時,必須遵照的準則,若是違反會出現意想不到的結果,請你們必定要遵照。
equals()相等的兩個對象,hashcode()必定相等;
equals()方法不相等的兩個對象,hashcode()有可能相等。(可能存在哈希衝突)。
1 /** 2 * @author xiaoyuer 3 * 4 */ 5 public class Students 6 { 7 private int age; 8 private String name; 9 10 public Students (int age,String name) 11 { 12 this.age = age; 13 this.name = name; 14 } 15 16 @Override 17 public boolean equals(Object obj) 18 { 19 //1.判斷傳入的對象是否與對象obj地址同樣 20 if (this == obj) 21 return true; 22 23 //2.x.equals(null),永遠返回是「false」; 24 if (obj == null) 25 return false; 26 27 //1.反射性 28 if (getClass() != obj.getClass()) 29 return false; 30 31 Students other = (Students) obj; 32 33 if (name == null) 34 { 35 if (other.name != null) 36 //name不爲空,且不相等,返回false 37 return false; 38 } 39 else if (!name.equals(other.name)) 40 return false; 41 42 //age不想等,返回false 43 if (age!= other.age) 44 return false; 45 46 return true; 47 48 } 49 50 //複寫了equals()方法後還要複寫hashCode()方法, 以保證相同的對象返回相同的hashcode 51 @Override 52 public int hashCode() 53 { 54 int result = 1; 55 final int prime = 31; 56 result = prime * result + ((name == null)?0:name.hashCode()); 57 result = prime * result + age; 58 return result; 59 } 60 61 public int getAge() { 62 return age; 63 } 64 65 public void setAge(int age) { 66 this.age = age; 67 } 68 69 public String getName() { 70 return name; 71 } 72 73 public void setName(String name) { 74 this.name = name; 75 } 76 } 77 78 class EqualTest 79 { 80 public static void main(String args[]) 81 { 82 Students e1=new Students(18,"張三"); 83 Students e2=new Students(18,"張三"); 84 85 System.out.println(e1 == e2); 86 System.out.println(e1.equals(e2)); 87 } 88 }
結果:
false
true