java equals和==的區(qū)別詳解
大概說equals和==都比較的是什么:
1. boolean tem = a == b;
首先==比較的肯定是地址,從堆棧的角度說也就是說==比較的是棧上面的內(nèi)容。因為棧是用來存放地址或是java中八大基本類型中自動變量的字面值(自動變量就是用int a = 1;這種形式來定義的變量)。如果是自動變量比較值的話肯定是用==來比較,因為equals()是一個方法,所以必須由對象調(diào)用才可以用于比較。而自動變量既不是類的實例也不是類的引用所以不能用equals()方法。
2.boolean tem = a.equals("b");
equals()方法一般用于比較的是對象的內(nèi)容但是也有的情況下也會去比較兩個對象的地址。
接下來
寫一個測試程序
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);
}
}
結(jié)果:
----Object------
false
false
true
true
----Boolean------
true
false
----Double------
true
false
----Integer------
true
false
----String------
true
false
----Date------
true
false
首先對Object的比較,當比較的兩個對象一樣時,==和equals()的結(jié)果都是true,當兩個對象不一樣時返回的都是false。所以在==和equals用于比較對象時,他們比較的都是對象的地址,其實本質(zhì)是一樣的。下面是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()方法用于比較兩個對象實際的內(nèi)容而不再是地址了,當然肯定不只是這些,這里只是舉出了幾個比較常見的java原生類重寫Object類的equals()方法的情況。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
spring webflux自定義netty 參數(shù)解析
這篇文章主要介紹了spring webflux自定義netty 參數(shù)解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實現(xiàn)訂單未支付則自動取消的五種方案及對比分析
作為電商系統(tǒng)中的核心功能,"訂單超時未支付自動取消" 是一個典型的定時任務(wù)場景,這個看似簡單的需求背后,隱藏著高并發(fā)、數(shù)據(jù)一致性、性能損耗等多個技術(shù)痛點,本文將從業(yè)務(wù)場景出發(fā),分析該需求的難點,然后依次介紹五種 Java 技術(shù)實現(xiàn)方案,需要的朋友可以參考下2025-05-05
springboot使用alibaba的druid數(shù)據(jù)庫連接池錯誤的問題及解決
這篇文章主要介紹了springboot使用alibaba的druid數(shù)據(jù)庫連接池錯誤的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
java數(shù)據(jù)結(jié)構(gòu)之二分查找法 binarySearch的實例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)之二分查找法 binarySearch的實例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10

