實(shí)現(xiàn)Java中對(duì)象比較的兩個(gè)方法_第1頁
實(shí)現(xiàn)Java中對(duì)象比較的兩個(gè)方法_第2頁
實(shí)現(xiàn)Java中對(duì)象比較的兩個(gè)方法_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)現(xiàn) Java 中對(duì)象比較的兩個(gè)方法本文就給大家介紹 Java 中對(duì)象比較的兩個(gè)方法,在 IF 等結(jié)構(gòu)語句中,往往需要根據(jù)對(duì)象比較所得出的值來進(jìn)行相 關(guān)的處理。 不過 Java 對(duì)象畢竟跟普通的變量不同。 要比較兩 個(gè)對(duì)象是否相同,跟比較兩個(gè)變量的值是否相同,有很大的 不同。 一.跟對(duì)象比較的幾個(gè)相關(guān)的概念。 為了更加審核的理 解對(duì)象比較的含義以及多個(gè)比較方法之間的差異,筆者認(rèn)為 讀者首先需要了解幾個(gè)相關(guān)的概念,或者說幾對(duì)關(guān)系。1.是類與對(duì)象的關(guān)系。 類是具體的抽象, 而對(duì)象是類的具體實(shí)現(xiàn)。 這可能聽起來還是有點(diǎn)模糊。做一個(gè)形象的比喻,類就好像 是用來制作塑料盒子的模具, 只要將 PVC 料注

2、入到這個(gè)模具 中就可以生產(chǎn)對(duì)應(yīng)形狀的盒子。而對(duì)象就好像是生產(chǎn)出來的 盒子。雖然模具同一個(gè),但是生產(chǎn)出來的盒子彼此之間仍然 是不同的。一方面先天性就是不同的。因?yàn)楦鶕?jù)相對(duì)論可以 說明世界上沒有兩個(gè)相同的東西。其次后天性的影響,也會(huì) 導(dǎo)致其不同。如生產(chǎn)出來后,在兩個(gè)盒子上分別貼上不同的 條碼,他們兩個(gè)就代表不同的盒子了。了解這個(gè)類與對(duì)象之 間的關(guān)系,對(duì)于了解對(duì)象之間進(jìn)行比較,會(huì)有很大的幫助。 2.是需要知道類與對(duì)象在內(nèi)存中的實(shí)際存儲(chǔ)情況。當(dāng)程序員 定義一個(gè)類時(shí) (不含有靜態(tài)成員或者變量 ),一般不會(huì)在內(nèi)存 中給其分配一個(gè)存儲(chǔ)結(jié)構(gòu)。而只有定義對(duì)象時(shí),才會(huì)在內(nèi)存中分配存儲(chǔ)結(jié)構(gòu)。當(dāng)利用同一個(gè)類定義不同的

3、對(duì)象時(shí),系統(tǒng) 會(huì)在內(nèi)存中為不同的對(duì)象創(chuàng)建不同的存儲(chǔ)結(jié)構(gòu)。也就是說, 會(huì)對(duì)應(yīng)不同的內(nèi)存地址。雖然同一個(gè)類中定義出來的對(duì)象, 其內(nèi)容可能相同 (成員變量、成員方法等等都相同),但是其內(nèi)存中的地址仍然是不同的。 3.是需要注意對(duì)象的復(fù)制問題。 如果要?jiǎng)?chuàng)建幾個(gè)內(nèi)容相同的對(duì)象,即復(fù)制相同內(nèi)容的對(duì)象, 現(xiàn)在主要有兩種方法。一是通過成員變量賦值來完成。如在 根據(jù)同一個(gè)類創(chuàng)建對(duì)象時(shí),分別給與他們相同的初始化值。 那么這兩個(gè)對(duì)象的內(nèi)容就是相同的。二是通過地址賦值來完 成。即將第一個(gè)對(duì)象在內(nèi)存中的地址賦值給第二個(gè)對(duì)象。此 時(shí)兩個(gè)對(duì)象名字雖然不同,但是他們卻指向內(nèi)存中的同一塊 區(qū)域。此時(shí)就好像一個(gè)人有兩個(gè)名字,其實(shí)

4、是同一個(gè)人。所 以這兩個(gè)對(duì)象內(nèi)容也就相同了。二.利用 = 運(yùn)算符與 equals方法來比較對(duì)象。在Java語言中,主要可以利用=運(yùn)算符(兩 個(gè)等號(hào) )和 equal 函數(shù)來對(duì)對(duì)象進(jìn)行比較。不過這兩個(gè)符號(hào)其 實(shí)現(xiàn)的機(jī)制不同?;蛘哒f,對(duì)于同樣的兩個(gè)對(duì)象,如果利用 他們來進(jìn)行比較的話, 往往會(huì)有不同的結(jié)果。 如 String 是 Java 自定義的對(duì)象,其主要用來存儲(chǔ)字符串?dāng)?shù)據(jù)?,F(xiàn)在筆者利用 如下語句定義了三個(gè) String 對(duì)象。 String str1=new String( “ welcome ” ); /創(chuàng)建一個(gè)對(duì)象,給利用單詞welcome初始化 String str2=new Strin

5、g( “ welcome”); / 創(chuàng)建一個(gè)對(duì)象, 給利用單詞 welcome 初始化 String str3=str1; / 創(chuàng)建一個(gè)對(duì)象,并利用對(duì)象 str1 的地址賦值以上三個(gè)對(duì)象,顯而易見,其內(nèi) 容都是相同的。但是利用這個(gè)兩種方式來對(duì)他們進(jìn)行比較的 時(shí)候,往往會(huì)有不同的結(jié)果。如利用 =( 兩個(gè)等號(hào) )比較符號(hào) 來進(jìn)行比較,str仁=str2,最后返回的結(jié)構(gòu)是false,也就是他 們是不相同的對(duì)象。可是如果比較 str1=str3 對(duì)象,則最后 返回的結(jié)果卻是true。但是利用equal函數(shù)來比較,則返回 的結(jié)果是相同的。為什么對(duì)象的內(nèi)容相同,它們返回的結(jié)果 卻是不同的呢 ?要回答這個(gè)問

6、題, 就需要大家先回顧一下筆者 上面談到的幾對(duì)關(guān)系。首先,對(duì)象strl與對(duì)象str2的關(guān)系,就好像是同一個(gè)模具出來的兩個(gè)盒子,他們從外觀看起來雖 然相同,但是通過放大鏡或者其他精密儀器仍然可以看到, 兩個(gè)盒子是不同的東西。這兩個(gè)對(duì)象雖然內(nèi)容相同,但是其 在內(nèi)存中分配的地址不同。也就是說,是同一個(gè)模具出來的 外觀看起來相同的不同的盒子。而對(duì)象 str1 與對(duì)象 str3 就好 像是一個(gè)人有兩個(gè)名字。雖然名字不同,但是實(shí)際上是同一 個(gè)人。這主要是因?yàn)樗麄兊纳矸葑C號(hào)碼相同。其實(shí)這個(gè)身份 證號(hào)碼就好像是內(nèi)存中發(fā)配的地址,而對(duì)象名字就好象是人 的名字。 一個(gè)人可以有好幾個(gè)名字 (一個(gè)對(duì)象有好幾個(gè)名字 )

7、, 但是其身份證號(hào)碼只有一個(gè) (內(nèi)存分配地址只有一個(gè) )。在上 面的語句中,通過str3=str1,其實(shí)現(xiàn)的功能,并不是將對(duì)象 strl的值賦值給對(duì)象str3。而是將對(duì)象strl在內(nèi)存中的地址 賦值給了對(duì)象str1(就好像是將一個(gè)人的身份證號(hào)碼復(fù)制給了另外一個(gè)人 )。所以從本質(zhì)上說, str3 并不是一個(gè)新建立的 對(duì)象。因?yàn)橄到y(tǒng)并沒有在內(nèi)存中為其分配一個(gè)新的存儲(chǔ)區(qū)域 (即并沒有創(chuàng)造一個(gè)新的人 ),而只是好像給對(duì)象另外取了一 個(gè)別名。所以說, 在對(duì)象比較的時(shí)候, 需要搞清楚一個(gè)問題。 即現(xiàn)在要比較的是他們的內(nèi)容還是在內(nèi)存中指向的地址。一 般來說,內(nèi)容相同不一定他們?cè)趦?nèi)存中指向的地址也是相同 的。

8、而不同的對(duì)象在內(nèi)存中若指向同一個(gè)地址,則他們的內(nèi) 容肯定是相同的 (因?yàn)樗麄儗?shí)際上就是同一個(gè)對(duì)象 )。而=( 兩 個(gè)等號(hào) )運(yùn)算符與 equal 函數(shù)就是運(yùn)來比較這兩塊內(nèi)容的。 其 中=運(yùn)算符是用來比較內(nèi)存中的地址是否相同,即比較它們的身份證號(hào)碼是否相同。 而 equal 函數(shù)則只比較他們的內(nèi)容。 如果他們的內(nèi)容相同, 即使身份證號(hào)碼不相同 (內(nèi)存中的地址 不同 ),這個(gè)函數(shù)也人們他們是相同的, 會(huì)返回 TRUE 值。這 就是這個(gè)兩個(gè)對(duì)象比較方式的最大不同?;蛘哒f,他們?cè)趯?duì) 對(duì)象進(jìn)行比較時(shí),出發(fā)點(diǎn)不同。一個(gè)比較對(duì)象名字所指向的 內(nèi)存地址是否相同,另外一個(gè)比較的時(shí)對(duì)象名字所指向的存 儲(chǔ)模塊中的內(nèi)

9、容是否相同。所以他們就會(huì)返回不同的結(jié)果。 三.慎用內(nèi)存地址賦值。 在實(shí)際工作中, 筆者提醒程序開發(fā)人 員,要慎用這種 str3=str1 內(nèi)存地址的賦值形式。其實(shí),利用 這種形式來創(chuàng)建對(duì)象,其實(shí)根本沒有創(chuàng)建一個(gè)新的對(duì)象。而 只是將兩個(gè)對(duì)象同時(shí)指向內(nèi)存中的同一個(gè)存儲(chǔ)區(qū)域。由于他 們實(shí)際上是同一個(gè)對(duì)象,為此通過其中一個(gè)對(duì)象修改了對(duì)象的內(nèi)容,那么另外一個(gè)對(duì)象名字調(diào)用的對(duì)象其也會(huì)受到影 響。也就是說,它們相互之間缺乏獨(dú)立性。為此在創(chuàng)建對(duì)象 的時(shí)候,如果沒有特殊的必要,最好為不同的對(duì)象名創(chuàng)建不 同的實(shí)體對(duì)象。而不要將多個(gè)對(duì)象名指向同一個(gè)對(duì)象,這在 開發(fā)應(yīng)用程序的時(shí)候容易導(dǎo)致對(duì)象內(nèi)容被無意中修改,從而 導(dǎo)致應(yīng)用程序結(jié)果出錯(cuò)。最后筆者需要提醒的是,在選擇對(duì) 象比較方式的時(shí)候,要了解 =運(yùn)算符與 euqal 函數(shù)之間的差 異。如果只是想比較對(duì)象的內(nèi)容是否相同,則只需要使用 equal函數(shù)即可。但是如果要比較他們是否是同一個(gè)對(duì)象,即在內(nèi)存中是否指向同一個(gè)存儲(chǔ)區(qū)域,則需要使用 =運(yùn)算符。 在實(shí)際應(yīng)用的過程中,千萬不能夠張冠李戴。否則的話,很 容易導(dǎo)致相反的結(jié)果。特別是將他們返回的值當(dāng)作條件判斷 語句時(shí),更加需要謹(jǐn)慎。因?yàn)榇藭r(shí)如果選擇的方法錯(cuò)誤,則 最后產(chǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論