大概說equals和==都比較的是什么:
1. boolean tem = a == b;
首先==比較的肯定是地址,從堆棧的角度說也就是說==比較的是棧上面的內容。因為棧是用來存放地址或是java中八大基本類型中自動變量的字面值(自動變量就是用int a = 1;這種形式來定義的變量)。如果是自動變量比較值的話肯定是用==來比較,因為equals()是一個方法,所以必須由對象調用才可以用于比較。而自動變量既不是類的實例也不是類的引用所以不能用equals()方法。
2.boolean tem = a.equals("b");
equals()方法一般用于比較的是對象的內容但是也有的情況下也會去比較兩個對象的地址。
接下來
寫一個測試程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package com; import java.util.Date; public class test { public static void main(String[] args) { Integer integer1 = new Integer( 1 ); Integer integer2 = new Integer( 1 ); String str1 = new String( "123" ); String str2 = new String( "123" ); Date date1 = new Date(); Date date2 = new Date(); Double double1 = new Double( "1.0" ); Double double2 = new Double( "1.0" ); Boolean tem1 = new Boolean( true ); Boolean tem2 = new Boolean( true ); Object object1 = new Object(); Object object2 = new Object(); System.out.println( "----Object------" ); System.out.println(object1.equals(object2)); System.out.println(object1 == object2); System.out.println(object1.equals(object1)); System.out.println(object1 == object1); System.out.println( "----Boolean------" ); System.out.println(tem1.equals(tem2)); System.out.println(tem1 == tem2); System.out.println( "----Double------" ); System.out.println(double1.equals(double2)); System.out.println(double1 == double2); System.out.println( "----Integer------" ); System.out.println(integer1.equals(integer2)); System.out.println(integer1 == integer2); System.out.println( "----String------" ); System.out.println(str1.equals(str2)); System.out.println(str1 == str2); System.out.println( "----Date------" ); System.out.println(date1.equals(date2)); System.out.println(date1 == date2); } } |
結果:
----Object------
false
false
true
true
----Boolean------
true
false
----Double------
true
false
----Integer------
true
false
----String------
true
false
----Date------
true
false
首先對Object的比較,當比較的兩個對象一樣時,==和equals()的結果都是true,當兩個對象不一樣時返回的都是false。所以在==和equals用于比較對象時,他們比較的都是對象的地址,其實本質是一樣的。下面是Object類中equals()方法的代碼:
1
2
3
4
|
public boolean equals(Object obj) { return ( this == obj); } |
而對于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他們的源碼,下面我依次貼出來在Boolean,Double,Interger,String,Date這些類中equals()方法的源碼,這時候equals()方法就被重寫了,因為這些類都是繼承于Object類的嘛。
Boolean:
1
2
3
4
5
6
|
public boolean equals(Object obj) { if (obj instanceof Boolean) { return value == ((Boolean)obj).booleanValue(); } return false ; } |
Double:
1
2
3
4
5
|
public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); } |
Interger:
1
2
3
4
5
6
|
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false ; } |
String:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public boolean equals(Object anObject) { if ( this == anObject) { return true ; } if (anObject instanceof 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 ; } |
Date:
1
2
3
|
public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); } |
也就是說在這些時候重寫了Object類的equals()方法用于比較兩個對象實際的內容而不再是地址了,當然肯定不只是這些,這里只是舉出了幾個比較常見的java原生類重寫Object類的equals()方法的情況。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!