




免費預覽已結束,剩余1頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
java中equals和=的區(qū)別 值類型是存儲在內(nèi)存中的堆棧(以后簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。=操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內(nèi)容是否相同。equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的內(nèi)容是否相同。=比較的是2個對象的地址,而equals比較的是2個對象的內(nèi)容。顯然,當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)建一個字符串緩沖池當使用 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ù)類型,默認值可以為0;2.Integer是int的封裝類,默認值為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以上的版本中,基本類型和封裝類能自動轉化,與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之間什么關系只是為了維護 hashCode 方法的常規(guī)協(xié)定,才要求用equals比較的兩個對象的hashCode相同.equals()和hashCode()都來自java.lang.Object.你當然可以重寫.比如a.equals(b).僅當a的內(nèi)存地址相等時,才返回true.當然如String等類已經(jīng)對這個方法進行了重寫,比較的就不再是內(nèi)存地址了.hashCode()的值也是與內(nèi)存地址相關的.所以僅當內(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)存地址相關了.這樣做是為了保證用equals比較返回為true的兩個對象,他們的hashCode是相同的.所以一般重寫equals的時候都會重寫hashCode().當然,這個相當于一個約定,一個協(xié)議.你不這么做并不會錯. 五、hashCode在一般的應用中你不需要了解hashcode的用法,但當你用到hashmap,hashset等集合類時要注意下hashcode。你想通過一個object的key來拿hashmap的value,hashmap的工作方法是,通過你傳入的object的hashcode在內(nèi)存中找地址,當找到這個地址后再通過equals方法來比較這個地址中的內(nèi)容是否
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年K2學校STEM課程實施效果對學生未來國際競爭力提升的推動評估報告
- 老年胰腺癌的診治現(xiàn)狀與策略2025
- Brand KPIs for online betting:1xBet in Mexiko-英文培訓課件2025.5
- DeepSeek大模型賦能金融領域解決方案
- 彰武縣積極推進互換并地工作的動因、成效及對策研究
- 空間視域下的文學地理學批評研究
- 線路測量試題及答案
- 湖北省六所名校2024-2025學年高一下學期4月期中聯(lián)考語文試卷(含答案)
- 2025年河南省鄭州外國語中學中考三模歷史試題(含答案)
- 2025標準版工地工程合同樣本
- 《基于專業(yè)成長共同體的名師工作室建設的思與行》專題講座
- 2023年廣東省深圳市南山區(qū)第二外國語學校(集團)學府中學中考歷史二模試卷
- 水處理藥劑使用的管理制度
- GB/T 32151.25-2024溫室氣體排放核算與報告要求第25部分:食品、煙草及酒、飲料和精制茶企業(yè)
- 佳能-M2-Wifi-相機說明書
- 2024年全國物業(yè)客服技能基礎知識考試題庫(附含答案)
- 廣西桂林市(2024年-2025年小學四年級語文)人教版期末考試(下學期)試卷及答案
- 辦公樓修繕工程投標方案(技術方案)
- 江蘇省無錫市2024年中考數(shù)學試卷【附參考答案】
- 食品生產(chǎn)加工小作坊生產(chǎn)規(guī)范 第4部分:粉條
- 防火門監(jiān)控系統(tǒng)調試、檢測、驗收記錄
評論
0/150
提交評論