国产18禁黄网站免费观看,99爱在线精品免费观看,粉嫩metart人体欣赏,99久久99精品久久久久久,6080亚洲人久久精品

編程經(jīng)驗(yàn)系列-Java學(xué)習(xí)雜談(三)

時(shí)間:2008-10-06 17:07:00   來(lái)源:無(wú)憂考網(wǎng)     [字體: ]
考試大編輯整理第三篇Java雜記了,前兩次分別講述了關(guān)于jvm、jdk、jre、collection、classLoader和一些DesignPattern的自我理解。這次仍然不準(zhǔn)備開(kāi)始過(guò)渡到j(luò)2ee中,因?yàn)橛X(jué)得還有一些瑣碎的j2se的問(wèn)題沒(méi)有總結(jié)完畢。
  1.關(guān)于Object類理解
  大家都知道Object是所有Java類的基類,意味著所有的Java類都會(huì)繼承了Object的11個(gè)方法。建議大家去看看Object的11個(gè)成員函數(shù)的源代碼,就會(huì)知道默認(rèn)的實(shí)現(xiàn)方式。比如equals方法,默認(rèn)實(shí)現(xiàn)就是用"=="來(lái)比較,即直接比較內(nèi)存地址,返回true或者false.而toString()方法,返回的串組成方式是??
  "getClass()。getName()+"@"+Integer.toHexString(hashCode())"其實(shí)不用我過(guò)多的解釋,大家都能看懂這個(gè)串的組成。接下來(lái)再看看hashCode():publicnativeinthashCode();
  由于是native方法,跟OS的處理方式相關(guān),源代碼里僅僅有一個(gè)聲明罷了。我們有興趣的話完全可以去深究它的hashCode到底是由OS怎么樣產(chǎn)生的呢?但筆者建議重要的還是先記住使用它的幾條原則吧!首先如果equals()方法相同的對(duì)象具有相通的hashCode,但equals()對(duì)象不相通的時(shí)候并不保證hashCode()方法返回不同的整數(shù)。而且下運(yùn)行同一個(gè)程序,同一個(gè)對(duì)象未必還是當(dāng)初的那個(gè)hashCode()哦。
  其余的方法呢?nofigy()、notifyAll()、clone()、wait()都是native方法的,說(shuō)明依賴于操作系統(tǒng)的實(shí)現(xiàn)。后一個(gè)有趣的方法是finalize(),類似C++的析構(gòu)函數(shù),簽名是protected,證明只有繼承擴(kuò)展了才能使用,方法體是空的,默示什么也不做。它的作用據(jù)筆者的了解僅僅是通知JVM此對(duì)象不再使用,隨時(shí)可以被銷毀,而實(shí)際的銷毀權(quán)還是在于虛擬機(jī)手上。那么它真的什么也不做麼?未必,實(shí)際上如果是線程對(duì)象它會(huì)導(dǎo)致在一定范圍內(nèi)該線程的優(yōu)先級(jí)別提高,導(dǎo)致更快的被銷毀來(lái)節(jié)約內(nèi)存提高性能。其實(shí)從常理來(lái)說(shuō),我們也可以大概這樣猜測(cè)出jvm做法的目的。
  2.關(guān)于重載hashCode()與Collection框架的關(guān)系
  筆者曾經(jīng)聽(tīng)一位搞Java培訓(xùn)多年的前輩說(shuō)在他看來(lái)hashCode方法沒(méi)有任何意義,僅僅是為了配合證明具有同樣的hashCode會(huì)導(dǎo)致equals方法相等而存在的。連有的前輩都犯這樣的錯(cuò)誤,其實(shí)說(shuō)明它還是滿容易被忽略的。那么hashCode()方法到底做什么用?
  學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的課程大家都會(huì)知道有一種結(jié)構(gòu)叫hashtable,目的是通過(guò)給每個(gè)對(duì)象分配一個(gè)的索引來(lái)提高查詢的效率。那么Java也不會(huì)肆意扭曲改變這個(gè)概念,所以hashCode的作用就是為支持?jǐn)?shù)據(jù)結(jié)構(gòu)中的哈希表結(jié)構(gòu)而存在的,換句話說(shuō),也就是只有用到集合框架的Hashtable、HashMap、HashSet的時(shí)候,才需要重載hashCode()方法,這樣才能使得我們能人為的去控制在哈希結(jié)構(gòu)中索引是否相等。筆者舉一個(gè)例子:曾經(jīng)為了寫一個(gè)求解類程序,需要隨機(jī)列出1,2,3,4組成的不同排列組合,所以筆者寫了一個(gè)數(shù)組類用int[]來(lái)存組合結(jié)果,然后把隨機(jī)產(chǎn)生的組合加入一個(gè)HashSet中,就是想利用HashSet不包括重復(fù)元素的特點(diǎn)?墒荋ashSet怎么判斷是不是重復(fù)的元素呢?當(dāng)然是通過(guò)hashCode()返回的結(jié)果是否相等來(lái)判斷啦,可做一下這個(gè)實(shí)驗(yàn):
  int[]A={1,2,3,4};
  int[]B={1,2,3,4};
  System.out.println(A.hashCode());
  System.out.println(B.hashCode());
  這明明是同一種組合,卻是不同的hashCode,加入Set的時(shí)候會(huì)被當(dāng)成不同的對(duì)象。這個(gè)時(shí)候我們就需要自己來(lái)重寫hashCode()方法了,如何寫呢?其實(shí)也是基于原始的hashCode(),畢竟那是操作系統(tǒng)的實(shí)現(xiàn),找到相通對(duì)象的標(biāo)識(shí),實(shí)現(xiàn)方式很多,筆者的實(shí)現(xiàn)方式是:首先重寫了toString()方法:return A[0]“+”A[1]“+”A[2]“+”A[3];//顯示上比較直觀然后利用toString()來(lái)計(jì)算hashCode():return this.toString()。hashCode();這樣上述A和B返回的就都是“1234”,在測(cè)試toString()。hashCode(),由于String在內(nèi)存中的副本是一樣的,“1234”。hashCode()返回的一定是相同的結(jié)果。
  說(shuō)到這,相信大家能理解得比我更好,今后千萬(wàn)不要再誤解hashCode()方法的作用。