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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論