1)比較方式角度:
= =是面向過程的操作符;equals是面向對象的操作符
= =不屬於任何類,equals則是任何類(在Java中)的一個方法;
我們可以1)Primitive1 (基本類型)= = Primitive2(基本類型);
2)Object Reference1(對象引用)= = Object Reference2(對象引用)
3)Object Reference1 (對象引用) .equals(Object Reference2 (對象引用))
這三種比較
但卻不能Primitive1 (基本類型).equals( Primitive2(基本類型));
對於基本類型,沒有面向對象中發送消息一說,自然也不會有
方法成員。
2)比較目的角度:
1) 如果要比較兩個基本類型是否相等,請用= =;
2) 如果要比較兩個對象引用是否相等,請用= =;
3) 如果要比較兩個對象(邏輯上)是否一致,請用equals;
對兩個對象(邏輯上)是否一致的闡釋:
有人會問:在C++中, 比較兩個對象相等不是也可以用==嗎?我知道您是指運算符重載,但是很遺憾,Java中不支持運算符重載(java中亦有重載過運算符,他們是“+”,“+=”,不過也僅此兩個,而且是內置實現的);所以,對象的是否相等的比較這份責任就交由 equals()來實現 。
這個“邏輯上”其實就取決於人類的看法,實際開發中,就取決於用戶的需求;
第三節:equals()緣起:
equals()是每個對象與生俱來的方法,因爲所有類的最終基類就是Object(除去Object本身);而equals()是Object的方法之一。
我們不妨觀察一下Object中equals()的source code:
public boolean equals(Object obj) {
return (this == obj);
}
注意 “return (this == obj)”
this與obj都是對象引用,而不是對象本身。所以equals()的缺省實現就是比較
對象引用是否一致;爲何要如此實現呢? 前面我們說過:對象是否相等,是由我們的需求決定的,世界上的類千奇百怪(當然,這些類都是我們根據模擬現實世界而創造的),雖然Object是他們共同的祖先,可他又怎能知道他的子孫類比較相等的標準呢?但是他明白,任何一個對象,自己總是等於自己的,何謂“自己總是等於自己”呢,又如何判斷“自己總是等於自己”呢?一個對象在內存中只有一份,但他的引用卻可以有無窮多個,“對象自己的引用1=對象自己的引用2”,不就能判斷“自己總是等於自己”嗎?所以缺省實現實現自然也就是
“return (this == obj)”;
而到了我們自己編寫的類,對象相等的標準由我們確立,於是就不可避免的要覆寫
繼承而來的public boolean equals(Object obj);
如果您有過編覆寫過equals()的經驗(沒有過也不要緊),請您思考一個問題:
“兩個對象(邏輯上)是否一致”實際上是比較什麼?沒錯,或許您已脫口而出:
就是對象的屬性(即field,或稱數據成員)的比較。方法是不可比較的哦。(這個問題是不是有些弱智呢?哈哈)
第四節:對一個推論的思考
推論如下:一言以蔽之:欲比較棧中數據是否相等,請用= =;
欲比較堆中數據是否相等,請用equals;
因爲(根)基本類型,(根)對象引用都在棧中; 而對象本身在堆中;
這句話又對又不對,問題出在哪,就是“數據”二字,先看棧中,數據或爲基本類型,或爲對象引用,用==比較當然沒錯;但是堆中呢?對象不是堆中嗎?不是應該用equals比較嗎?可是,我們比較的是堆中“數據”,堆中有對象,對象由什麼構成呢?可能是對象引用,可能是基本類型,或兩者兼而有之。如果我們要比較他們,該用什麼呢,用”equals()”?不對吧,只能是”= =”!所以正確的結論是:欲比較棧中數據是否相等,請用= =; 欲比較堆中數據是否相等,請用equals;
因爲(根)基本類型,(根)對象引用都在棧中(所謂“根”,指未被任何其他對象所包含); 而對象本身在堆中。
Java中"equals"和"=="的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Java项目面试实操 提升大厂面试成功率
wy53780
2020-04-23 14:14:04
玩转算法系列--图论精讲 面试升职必备(Java版)
wy53780
2020-04-23 14:03:23
玩转Java并发工具,精通JUC,成为并发多面手
wy53780
2020-04-23 13:56:08
线程八大核心+Java并发底层原理精讲(Java并发核心知识体系精讲)
wy53780
2020-04-23 13:55:55
Java通用型支付+电商平台双系统实战
wy53780
2020-04-23 13:54:42
【躍遷之路】【734天】程序員高效學習方法論探索系列(實驗階段491-2019.2.24)
Wall_Breaker
2019-02-24 23:25:10
Java是怎麼運行的?
勤思
2019-02-24 22:52:36
sql語法、關係建模
死瘦宅
2019-02-24 22:35:22
MySQL 事務、函數、觸發器、數據庫備份、權限管理
死瘦宅
2019-02-24 22:35:12
Python與家國天下
豌豆花下貓
2019-02-24 22:22:40
Java面試 | 002
Java貓說
2019-02-24 21:05:12
《從0到1學習Flink》—— Flink 讀取 Kafka 數據批量寫入到 MySQL
zhisheng
2019-02-24 21:04:11
Redis | 001能做什麼?
Java貓說
2019-02-24 21:03:51
java中具有繼承關係的類及其對象初始化順序
Linus脫襪子
2019-02-24 19:55:05