freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

java內存堆和棧深入-資料下載頁

2024-08-27 16:23本頁面
  

【正文】 須是獨特的元對象)。這個例子說明一個元對象可以和其他不同的元對象擁有相同的hashCode。但是一個 元對象只能和擁有同樣內容的元對象相等。所以這兩個規(guī)則必須成立。設計這兩個函數所要注意到的:如果你設計的對象類型并不使用于收集性對象,那么沒有必要自己再設計這兩個函數的處理方式。這是正確的面向對象設計方法,任何用戶一時用不到的功能,就先不要設計,以免給日后功能擴展帶來麻煩。如果你在設計時想別出心裁,不遵守以上的兩套規(guī)則,那么勸你還是不要做這樣想入非非的事。我還沒有遇到過哪一個開發(fā)者和我說設計這兩個函數要違背前面說的兩個規(guī)則,我碰到這些違反規(guī)則的情況時,都是作為設計錯誤處理。當一個對象類型作為收集型對象的元對象時,這個對象應該擁有自己處理equals(),和/或處理hashCode()的設計,而且要遵守前面所說 的兩種原則。equals()先要查null和是否是同一類型。查同一類型是為了避免出現ClassCastException這樣的異常給丟出來。查 null是為了避免出現NullPointerException這樣的異常給丟出來。如果你的對象里面容納的數據過多,那么這兩個函數 equals()和hashCode()將會變得效率低。如果對象中擁有無法serialized的數據,equals()有可能在操作中出現錯誤。想象 一個對象x,它的一個整型數據是transient型(不能被serialize成二進制數據流)。然而equals()和hashCode()都有依靠 這個整型數據,那么,這個對象在serialization之前和之后,是否一樣?答案是不一樣。因為serialization之前的整型數據是有效的 數據,在serialization之后,這個整型數據的值并沒有存儲下來,再重新由二進制數據流轉換成對象后,兩者(對象在serialization 之前和之后)的狀態(tài)已經不同了。這也是要注意的。知道以上這些能夠幫助你:1. 進行更好的設計和開發(fā)。2. 進行更好的測試案例開發(fā)。3. 在面試過程中讓面試者對你的學識淵博感到滿意。 hashCode的作用  總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是 Set。你知道它們的區(qū)別嗎?前者集合內的元素是有序的,元素可以重復;后者元素無序,但元素不可重復。那么這里就有一個比較嚴重的問題了:要想保證元素不重復,可兩個元素是否重復應該依據什么來判斷呢?。但是,如果每增加一個元素就檢查一次,那么當元素很多時,后添加到集合中的元素比較的次數就非常多了。也就是說,如果集合中現在已經有1000個元素,那么第1001個元素加入集合時,它就要調用1000次 equals方法。這顯然會大大降低效率。 于是,Java采用了哈希表的原理。哈希(Hash)實際上是個人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也稱為散列算法,是將數據依特定算法直接指定到一個地址上。如果詳細講解哈希算法,那需要更多的文章篇幅,我在這里就不介紹了。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能并不是)。 這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。所以,Java對于eqauls方法和hashCode方法是這樣規(guī)定的:如果兩個對象相同,那么它們的hashCode值一定要相同;如果兩個對象的hashCode相同,它們并不一定相同,上面說的對象相同指的是用eqauls方法比較。你當然可以不按要求去做了,但你會發(fā)現,相同的對象可以出現在Set集合中。同時,增加新元素的效率會大大下降。我們知道,equals()函數是用來做比較的。java中的比較有兩種:一種是內存地址的比較,一種是內容的比較。而比較個體也有兩種:一種是簡單類型(這類簡單說來無所謂內存地址的比較或者內容比較的區(qū)別);還有一種是對象的比較,本文中說的主要是后者在java中,(對象)內存地址的比較,是通過==完成的。比如 這樣的語句中,我們認為,如果obj1和obj2的內存地址相同,則返回true而equals()通常是比較內容的。這里說“通?!?,是因為在最根本的Object類中,equal()函數做的是地址的比較。而在其他幾乎所有的類中,equals()都經過重載,進行內容的比較。而在說equals()的時候我們還涉及hashCode()是因為在有些應用中(比如,HashMap的key是對象),必須在重載equals()的同時重載hashCode()。因為java中默認(Object)的hashCode是根據對象的地址計算得到的。我們通常不會注意到這個問題,因為我們通常所使用的key都是簡單類型,或者是String, Long等一些特殊的對象(其特殊性請參看筆者在寫java 淺拷貝和深拷貝時的討論),這時候,這個問題被我們無意間繞過了有人已經概括了這種我們忽略了的情況:“如果你想將一個對象A放入另一個收集(集合)對象B里,或者使用這個對象A為查找一個元對象在收集對 象B里位置的鑰匙(key),并支持是否容納(isContains()),刪除收集對象B里的元對象(remove()?)這樣的操作,那么,equals()和hashCode()函數必須開發(fā)者自己定義?!?(括號為筆者添加)
點擊復制文檔內容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1