偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

簡單介紹==和equals區(qū)別

開發(fā) 后端
本文介紹equal和==的區(qū)別,這是很容易混淆的基本知識(shí),希望初學(xué)者認(rèn)真的研究?;A(chǔ)是最重要的,希望本文對大家有幫助,一起來看。

在復(fù)習(xí)以前學(xué)習(xí)內(nèi)容,發(fā)現(xiàn)equal == 是我以前學(xué)習(xí)的盲點(diǎn),所以查找資料,發(fā)現(xiàn)這個(gè)資料解釋的確實(shí)不錯(cuò),發(fā)出來供大家參考.
總結(jié):

  • ==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間
  • equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同

實(shí)例:

 

  1. public static void main(String[] args) {  
  2. Integer num1=new Integer(23);  
  3. Integer num2=new Integer(23);  
  4. if(num1==num2){  
  5. System.out.println("地址相等");  
  6. }else if(num1.equals(num2)){  
  7. System.out.println("值相等");  
  8. }  

 

輸出為:值相等

eqauls 與 = =之異同

1)比較方式角度:

= =是面向過程的操作符;equals是面向?qū)ο蟮牟僮鞣?/p>

= =不屬于任何類,equals則是任何類(在Java中)的一個(gè)方法;

我們可以:

(1)Primitive1 (基本類型)= = Primitive2(基本類型);

(2)Object Reference1(對象引用)= = Object Reference2(對象引用)

(3)Object Reference1 (對象引用) .equals(Object Reference2 (對象引用))

這三種比較

但卻不能Primitive1 (基本類型).equals( Primitive2(基本類型));

對于基本類型,沒有面向?qū)ο笾邪l(fā)送消息一說,自然也不會(huì)有

方法成員。

 

2)比較目的角度:

1) 如果要比較兩個(gè)基本類型是否相等,請用= =;

2) 如果要比較兩個(gè)對象引用是否相等,請用= =;

3) 如果要比較兩個(gè)對象(邏輯上)是否一致,請用equals;

對兩個(gè)對象(邏輯上)是否一致的闡釋:

有人會(huì)問:在C++中, 比較兩個(gè)對象相等不是也可以用==嗎?我知道您是指運(yùn)算符重載,但是很遺憾,Java中不支持運(yùn)算符重載(java中亦有重載過運(yùn)算符,他們是“+”,“+=”,不過也僅此兩個(gè),而且是內(nèi)置實(shí)現(xiàn)的);所以,對象的是否相等的比較這份責(zé)任就交由 equals()來實(shí)現(xiàn)。

這個(gè)“邏輯上”其實(shí)就取決于人類的看法,實(shí)際開發(fā)中,就取決于用戶的需求;

有人會(huì)有看法:“取決于人類的看法”太過寬泛和不嚴(yán)肅,如果某人要兩件

風(fēng)牛馬不相及的事物也相等,equals是否也能作出這樣的比較呢?我們說可以的

下面這個(gè)例子說明了這一點(diǎn):

 

 

  1. class Horse {  
  2. String Type;  
  3. int Legs;  
  4. //相等的標(biāo)準(zhǔn):腿的數(shù)目相等  
  5. public boolean equals(Object o){  
  6. if(this.Legs==((Cattle)o).Legs){  
  7. return true;  
  8. }  
  9. return false;  
  10. }  
  11. public Horse(String Type,int legs){  
  12. this.Type=Type;  
  13. this.Legs=legs;  
  14. }   
  15. }  
  16. class Cattle  
  17. {  
  18. String Type;  
  19. int Legs;  
  20. //相等的標(biāo)準(zhǔn):腿的數(shù)目相等  
  21. public Cattle(String Type,int legs){  
  22. this.Type=Type;  
  23. this.Legs=legs;  
  24. }  
  25. public boolean equals(Object o){  
  26. if(this.Legs==((Horse)o).Legs){  
  27. return true;  
  28. }  
  29. return false;  
  30. }  
  31. }  
  32. public class EqualsTest{  
  33. public static void main(String[] args)  
  34. {   
  35. Cattle c=new Cattle("I'm the Cattle",4);  
  36. Horse h=new Horse("I'm the Horse",4);  
  37. if(c.equals(h)){  
  38. System.out.println(c.Type);  
  39. System.out.println(h.Type);  
  40. System.out.println("Cattle Equals Horse");  
  41. }  
  42. }  

輸出結(jié)果:

"I'm the Cattle"

"I'm the Horse"

"Cattle Equals Horse"

您瞧瞧:牛果真等于了馬,為何相等?因?yàn)槲覀兌x的相等標(biāo)準(zhǔn)是:腿的數(shù)目相等;您會(huì)說:“這太滑稽”,是滑稽,可這是人類的看法,計(jì)算機(jī)可沒有滑稽的概念,當(dāng)然也沒有“不滑稽”的概念,我們定義了什么相等標(biāo)準(zhǔn),他就踏踏實(shí)實(shí)的為我們實(shí)現(xiàn)了;

所以說:相等標(biāo)準(zhǔn)(即需求)一定要定好,否則,滑稽的事可就多了

第三節(jié):equals()緣起:

equals()是每個(gè)對象與生俱來的方法,因?yàn)樗蓄惖淖罱K基類就是Object(除去Object本身);而equals()是Object的方法之一。

我們不妨觀察一下Object中equals()的source code:

 

  1. public boolean equals(Object obj) {  
  2. return (this == obj);  

 

注意 “return (this == obj)”

this與obj都是對象引用,而不是對象本身。所以equals()的缺省實(shí)現(xiàn)就是比較

對象引用是否一致;為何要如此實(shí)現(xiàn)呢?前面我們說過:對象是否相等,是由我們的需求決定的,世界上的類千奇百怪(當(dāng)然,這些類都是我們根據(jù)模擬現(xiàn)實(shí)世界而創(chuàng)造的),雖然Object是他們共同的祖先,可他又怎能知道他的子孫類比較相等的標(biāo)準(zhǔn)呢?但是他明白,任何一個(gè)對象,自己總是等于自己的,何謂“自己總是等于自己”呢,又如何判斷“自己總是等于自己”呢?一個(gè)對象在內(nèi)存中只有一份,但他的引用卻可以有無窮多個(gè),“對象自己的引用1=對象自己的引用2”,不就能判斷“自己總是等于自己”嗎?所以缺省實(shí)現(xiàn)實(shí)現(xiàn)自然也就是

“return (this == obj)”;

而到了我們自己編寫的類,對象相等的標(biāo)準(zhǔn)由我們確立,于是就不可避免的要覆寫

繼承而來的public boolean equals(Object obj);

如果您有過編覆寫過equals()的經(jīng)驗(yàn)(沒有過也不要緊),請您思考一個(gè)問題:

“兩個(gè)對象(邏輯上)是否一致”實(shí)際上是比較什么?沒錯(cuò),或許您已脫口而出:

就是對象的屬性(即field,或稱數(shù)據(jù)成員)的比較。方法是不可比較的哦。(這個(gè)問題是不是有些弱智呢?哈哈)

第四節(jié):對一個(gè)推論的思考

推論如下:一言以蔽之:欲比較棧中數(shù)據(jù)是否相等,請用= =;

欲比較堆中數(shù)據(jù)是否相等,請用equals;

因?yàn)椋ǜ┗绢愋停ǜο笠枚荚跅V校?而對象本身在堆中;

這句話又對又不對,問題出在哪,就是“數(shù)據(jù)”二字,先看棧中,數(shù)據(jù)或?yàn)榛绢愋?,或?yàn)閷ο笠茫?=比較當(dāng)然沒錯(cuò);但是堆中呢?對象不是堆中嗎?不是應(yīng)該用equals比較嗎?可是,我們比較的是堆中“數(shù)據(jù)”,堆中有對象,對象由什么構(gòu)成呢?可能是對象引用,可能是基本類型,或兩者兼而有之。如果我們要比較他們,該用什么呢,用”equals()”?不對吧,只能是”= =”!所以正確的結(jié)論是:欲比較棧中數(shù)據(jù)是否相等,請用= =; 欲比較堆中數(shù)據(jù)是否相等,請用equals;

因?yàn)椋ǜ┗绢愋?,(根)對象引用都在棧中(所謂“根”,指未被任何其他對象所包含);而對象本身在堆中。

到這,==和equals的區(qū)別介紹完了,希望對你有幫助。

【編輯推薦】

  1. Java 多線程同步問題的探究(一)
  2. Java 多線程同步問題的探究(二)
  3. 詳細(xì)介紹JAVA和C++區(qū)別
  4. JAVA開發(fā) 分析JNI標(biāo)準(zhǔn)原理
  5. 解析Java軟件開發(fā)中的五種認(rèn)識(shí)誤區(qū)
責(zé)任編輯:于鐵 來源: 新浪博客
相關(guān)推薦

2009-09-17 15:10:57

RefrenceEqu

2009-06-30 13:38:37

SERVLET和JSP

2023-10-12 08:25:18

Javaequals內(nèi)存

2024-03-19 14:41:08

C#操作符開發(fā)

2023-12-15 09:21:17

ObjectJavaString

2009-11-03 14:13:23

VB.NET C#

2009-06-24 17:43:24

Struts和JSF

2020-07-01 07:44:06

javaSE==equals

2009-07-02 10:13:47

ASP和JSPJSP頁面

2009-08-07 09:29:22

C#數(shù)組C#函數(shù)

2010-07-14 17:38:47

MIME協(xié)議

2009-09-07 16:09:19

C#和Java特點(diǎn)

2009-08-27 13:37:11

C#類和結(jié)構(gòu)

2011-06-21 15:00:07

JAVAC++

2011-07-08 16:24:53

VOPO

2011-03-04 13:19:09

VSFTP介紹

2011-04-01 09:39:17

zabbix

2011-02-22 16:38:03

Konqueror

2011-01-21 18:08:22

Qmail

2011-03-29 09:14:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號