java中的==與equals()

==用法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使用
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 }
jdk覆蓋機制

運行結果

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 }
複寫equals

結果:

false

true

相關文章
相關標籤/搜索