equals和==的區(qū)別.doc_第1頁(yè)
equals和==的區(qū)別.doc_第2頁(yè)
equals和==的區(qū)別.doc_第3頁(yè)
equals和==的區(qū)別.doc_第4頁(yè)
equals和==的區(qū)別.doc_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

java中equals和=的區(qū)別 值類型是存儲(chǔ)在內(nèi)存中的堆棧(以后簡(jiǎn)稱棧),而引用類型的變量在棧中僅僅是存儲(chǔ)引用類型變量的地址,而其本身則存儲(chǔ)在堆中。=操作比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量在堆中存儲(chǔ)的地址是否相同,即棧中的內(nèi)容是否相同。equals操作表示的兩個(gè)變量是否是對(duì)同一個(gè)對(duì)象的引用,即堆中的內(nèi)容是否相同。=比較的是2個(gè)對(duì)象的地址,而equals比較的是2個(gè)對(duì)象的內(nèi)容。顯然,當(dāng)equals為true時(shí),=不一定為true;一、String中的equals和=1、public class TestString public static void main(String args) String s1 = Monday; String s2 = Monday; 上面這段程序中,到底有幾個(gè)對(duì)象呢?來(lái)檢測(cè)一下吧,稍微改動(dòng)一下程序public class TestString public static void main(String args) String s1 = Monday; String s2 = Monday; if (s1 = s2) System.out.println(s1 = s2); else System.out.println(s1 != s2); 編譯并運(yùn)行程序,輸出:s1 = s2說(shuō)明:s1 與 s2 引用同一個(gè) String 對(duì)象 - Monday!2.再稍微改動(dòng)一下程序,會(huì)有更奇怪的發(fā)現(xiàn):public class TestString public static void main(String args) String s1 = Monday; String s2 = new String(Monday); if (s1 = s2) System.out.println(s1 = s2); else System.out.println(s1 != s2); if (s1.equals(s2) System.out.println(s1 equals s2); else System.out.println(s1 not equals s2); 我們將 s2 用 new 操作符創(chuàng)建程序輸出:s1 != s2s1 equals s2說(shuō)明:s1 s2分別引用了兩個(gè)MondayString對(duì)象3. 字符串緩沖池原來(lái),程序在運(yùn)行的時(shí)候會(huì)創(chuàng)建一個(gè)字符串緩沖池當(dāng)使用 s2 = Monday 這樣的表達(dá)是創(chuàng)建字符串的時(shí)候,程序首先會(huì)在這個(gè)String緩沖池中尋找相同值的對(duì)象,在第一個(gè)程序中,s1先被放到了池中,所以在s2被創(chuàng)建的時(shí)候,程序找到了具有相同值的 s1將 s2 引用 s1 所引用的對(duì)象Monday第二段程序中,使用了 new 操作符,他明白的告訴程序:我要一個(gè)新的!不要舊的!于是一個(gè)新的MondaySting對(duì)象被創(chuàng)建在內(nèi)存中。他們的值相同,但是位置不同,一個(gè)在池中游泳一個(gè)在岸邊休息。哎呀,真是資源浪費(fèi),明明是一樣的非要分開(kāi)做什么呢?4. 再次更改程序:public class TestString public static void main(String args) String s1 = Monday; String s2 = new String(Monday); s2 = ern(); if (s1 = s2) System.out.println(s1 = s2); else System.out.println(s1 != s2); if (s1.equals(s2) System.out.println(s1 equals s2); else System.out.println(s1 not equals s2); 這次加入:s2 = ern();程序輸出:s1 = s2s1 equals s2原來(lái),(java.lang.String的intern()方法 ern()方法的返回值還是字符串a(chǎn)bc,表面上看起來(lái)好像這個(gè)方法沒(méi)什么用處。但實(shí)際上,它做了個(gè)小動(dòng)作: 檢查字符串池里是否存在abc這么一個(gè)字符串,如果存在,就返回池里的字符串;如果不存在,該方法會(huì)把a(bǔ)bc添加到字符串池中,然后再返回它的引用。)更好的辦法:把所有的String都intern()到緩沖池去吧最好在用到new的時(shí)候就進(jìn)行這個(gè)操作String s2 = new String(Monday).intern();然后就可以用=比較兩個(gè)字符串的值了二、簡(jiǎn)單數(shù)據(jù)類型和封裝類中的equals和=Java為每一個(gè)簡(jiǎn)單數(shù)據(jù)類型提供了一個(gè)封裝類,每個(gè)基本數(shù)據(jù)類型可以封裝成對(duì)象類型。 除int(Integer)和char(Character),其余類型首字母大寫(xiě)即成封裝類類型名。double (Double), float(Float),long(Long), short(Short),byte(Byte),boolean(Boolean).以int和Integer為例說(shuō)明 Java中int和Integer區(qū)別如下:1.int是基本的數(shù)據(jù)類型,默認(rèn)值可以為0;2.Integer是int的封裝類,默認(rèn)值為null;3.int和Integer都可以表示某一個(gè)數(shù)值;4.int和Integer不能夠互用,因?yàn)樗麄儍煞N不同的數(shù)據(jù)類型;int a1=1;int a2=1;Integer b1 =new Integer (1);Integer b2 =new Integer (1);-a1=a2 這個(gè)是成立的,很簡(jiǎn)單,都知道a1=b1 這個(gè)是不成立的.表達(dá)式的值為 false ,它們是不同的數(shù)據(jù)類型(在jdk1.5以上版本中為true)b1=b2 這個(gè)也是不成立的.表達(dá)式的值為 false,雖然是相同的數(shù)據(jù)類型,但是它們是兩個(gè)對(duì)象,=比較的是2個(gè)對(duì)象的地址,它們的地址是不相等的,內(nèi)容相等都是1;b1.equals(b2)=true 這個(gè)是成立的,表達(dá)式的值為 true. 相同數(shù)據(jù)類型,兩個(gè)對(duì)象,地址不同,內(nèi)容相同, quals比較的是2個(gè)對(duì)象的內(nèi)容,所以成立。(a.equals(b),因?yàn)閑quals比較的是兩個(gè)對(duì)象,所以a,b都不能為基本數(shù)據(jù)類型,否則會(huì)出編譯錯(cuò)誤。)(在jdk1.5以上版本中,b可以為基本數(shù)據(jù)類型,a不可以)同理,其它的封裝類和基本類型也是這樣的.java中equals和=的區(qū)別=比較的是2個(gè)對(duì)象的地址,而equals比較的是2個(gè)對(duì)象的內(nèi)容。在jdk1.5以上的版本中,基本類型和封裝類能自動(dòng)轉(zhuǎn)化,與String類型的對(duì)象和字符串常量類似。 Integer i1 = 123; Integer i2 = 123; int i = 123; Integer i3 = new Integer(123); Integer i4 = new Integer(123); System.out.println(i1 = i2 = +(i1 = i2); System.out.println(i1.equals(i2) = +(i1.equals(i2); System.out.println(); System.out.println(i3 = i4 = +(i3 = i4); System.out.println(i3.equals(i4) = +(i3.equals(i4); System.out.println(); System.out.println(i2 = i4 = +(i2 = i4); System.out.println(i2.equals(i4) = +(i2.equals(i4); System.out.println(); System.out.println(i = i2 = +(i = i2); System.out.println(i1.equals(i) = +(i1.equals(i); System.out.println(); System.out.println(i = i4 = +(i = i4); System.out.println(i4.equals(i) = +(i4.equals(i); - i1 = i2 = true i1.equals(i2) = true i3 = i4 = false i3.equals(i4) = true i2 = i4 = false i2.equals(i4) = true i = i2 = true i1.equals(i) = true i = i4 = true i4.equals(i) = true三、其他類怎么使用equals和=API里的類大部分都重寫(xiě)了equals方法,沒(méi)有重寫(xiě)的一般是自己寫(xiě)的類,如果是你自己定義的一個(gè)類,比較自定義類用equals和=是一樣的,都是比較句柄地址,因?yàn)樽远x的類是繼承于object,而object中的equals就是用=來(lái)實(shí)現(xiàn)的,你可以看源碼。 四、java里equals和hashCode之間什么關(guān)系只是為了維護(hù) hashCode 方法的常規(guī)協(xié)定,才要求用equals比較的兩個(gè)對(duì)象的hashCode相同.equals()和hashCode()都來(lái)自java.lang.Object.你當(dāng)然可以重寫(xiě).比如a.equals(b).僅當(dāng)a的內(nèi)存地址相等時(shí),才返回true.當(dāng)然如String等類已經(jīng)對(duì)這個(gè)方法進(jìn)行了重寫(xiě),比較的就不再是內(nèi)存地址了.hashCode()的值也是與內(nèi)存地址相關(guān)的.所以僅當(dāng)內(nèi)存地址相等時(shí),hashCode才相等.同樣很多類也重寫(xiě)了這個(gè)方法,還是以String為例:public int hashCode() int h = hash;if (h = 0) int off = offset; char val = value; int len = count; for (int i = 0; i len; i+) h = 31*h + valoff+; hash = h; return h;就不在與內(nèi)存地址相關(guān)了.這樣做是為了保證用equals比較返回為true的兩個(gè)對(duì)象,他們的hashCode是相同的.所以一般重寫(xiě)equals的時(shí)候都會(huì)重寫(xiě)hashCode().當(dāng)然,這個(gè)相當(dāng)于一個(gè)約定,一個(gè)協(xié)議.你不這么做并不會(huì)錯(cuò). 五、hashCode在一般的應(yīng)用中你不需要了解hashcode的用法,但當(dāng)你用到hashmap,hashset等集合類時(shí)要注意下hashcode。你想通過(guò)一個(gè)object的key來(lái)拿hashmap的value,hashmap的工作方法是,通過(guò)你傳入的object的hashcode在內(nèi)存中找地址,當(dāng)找到這個(gè)地址后再通過(guò)equals方法來(lái)比較這個(gè)地址中的內(nèi)容是否

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論