java equals和==的差別詳解。本站提示廣大學習愛好者:(java equals和==的差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java equals和==的差別詳解正文
年夜概說equals和==都比擬的是甚麼:
1. boolean tem = a == b;
起首==比擬的確定是地址,從客棧的角度說也就是說==比擬的是棧下面的內容。由於棧是用來寄存地址或是java中八年夜根本類型中主動變量的字面值(主動變量就是用int a = 1;這類情勢來界說的變量)。假如是主動變量比擬值的話確定是用==來比擬,由於equals()是一個辦法,所以必需由對象挪用才可以用於比擬。而主動變量既不是類的實例也不是類的援用所以不克不及用equals()辦法。
2.boolean tem = a.equals("b");
equals()辦法普通用於比擬的是對象的內容然則也有的情形下也會去比擬兩個對象的地址。
接上去
寫一個測試法式
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()辦法的代碼:
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:
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
Double:
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
Interger:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
String:
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:
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
也就是說在這些時刻重寫了Object類的equals()辦法用於比擬兩個對象現實的內容而不再是地址了,固然確定不只是這些,這裡只是舉出了幾個比擬罕見的java原生類重寫Object類的equals()辦法的情形。
感激浏覽,願望能贊助到年夜家,感謝年夜家對本站的支撐!