av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語(yǔ)言

java的hash Code的使用方法

時(shí)間:2025-04-04 00:25:21 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

java的hash Code的使用方法

  首先,想要明白hashCode的作用,你必須要先知道Java中的集合。

  總的來(lái)說(shuō),Java中的集合(Collection)有兩類,一類是List,再有一類是Set。

  你知道它們的區(qū)別嗎?前者集合內(nèi)的元素是有序的,元素可以重復(fù);后者元素?zé)o序,但元素不可重復(fù)。

  那么這里就有一個(gè)比較嚴(yán)重的問(wèn)題了:要想保證元素不重復(fù),可兩個(gè)元素是否重復(fù)應(yīng)該依據(jù)什么來(lái)判斷呢?

  這就是Object.equals方法了。但是,如果每增加一個(gè)元素就檢查一次,那么當(dāng)元素很多時(shí),后添加到集合中的元素比較的次數(shù)就非常多了。

  也就是說(shuō),如果集合中現(xiàn)在已經(jīng)有1000個(gè)元素,那么第1001個(gè)元素加入集合時(shí),它就要調(diào)用1000次equals方法。這顯然會(huì)大大降低效率。

  于是,Java采用了哈希表的原理。哈希(Hash)實(shí)際上是個(gè)人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。

  哈希算法也稱為散列算法,是將數(shù)據(jù)依特定算法直接指定到一個(gè)地址上。如果詳細(xì)講解哈希算法,那需要更多的文章篇幅,我在這里就不介紹了。

  初學(xué)者可以這樣理解,hashCode方法實(shí)際上返回的就是對(duì)象存儲(chǔ)的物理地址(實(shí)際可能并不是)。

  這樣一來(lái),當(dāng)集合要添加新的元素時(shí),先調(diào)用這個(gè)元素的hashCode方法,就一下子能定位到它應(yīng)該放置的物理位置上。

  如果這個(gè)位置上沒(méi)有元素,它就可以直接存儲(chǔ)在這個(gè)位置上,不用再進(jìn)行任何比較了;如果這個(gè)位置上已經(jīng)有元素了,

  就調(diào)用它的equals方法與新元素進(jìn)行比較,相同的話就不存了,不相同就散列其它的地址。

  所以這里存在一個(gè)沖突解決的問(wèn)題。這樣一來(lái)實(shí)際調(diào)用equals方法的次數(shù)就大大降低了,幾乎只需要一兩次。

  所以,Java對(duì)于eqauls方法和hashCode方法是這樣規(guī)定的:

  1、如果兩個(gè)對(duì)象相同,那么它們的hashCode值一定要相同;2、如果兩個(gè)對(duì)象的hashCode相同,它們并不一定相同 上面說(shuō)的對(duì)象相同指的是用eqauls方法比較。

  你當(dāng)然可以不按要求去做了,但你會(huì)發(fā)現(xiàn),相同的對(duì)象可以出現(xiàn)在Set集合中。同時(shí),增加新元素的效率會(huì)大大下降。hashcode這個(gè)方法是用來(lái)鑒定2個(gè)對(duì)象是否相等的。

  那你會(huì)說(shuō),不是還有equals這個(gè)方法嗎? 不錯(cuò),這2個(gè)方法都是用來(lái)判斷2個(gè)對(duì)象是否相等的。但是他們是有區(qū)別的。

  一般來(lái)講,equals這個(gè)方法是給用戶調(diào)用的,如果你想判斷2個(gè)對(duì)象是否相等,你可以重寫equals方法,然后在代碼中調(diào)用,就可以判斷他們是否相等 了。簡(jiǎn)單來(lái)講,equals方法主要是用來(lái)判斷從表面上看或者從內(nèi)容上看,2個(gè)對(duì)象是不是相等。

  舉個(gè)例子,有個(gè)學(xué)生類,屬性只有姓名和性別,那么我們可以 認(rèn)為只要姓名和性別相等,那么就說(shuō)這2個(gè)對(duì)象是相等的。 hashcode方法一般用戶不會(huì)去調(diào)用,比如在hashmap中,由于key是不可以重復(fù)的,他在判斷key是不是重復(fù)的時(shí)候就判斷了hashcode 這個(gè)方法,而且也用到了equals方法。這里不可以重復(fù)是說(shuō)equals和hashcode只要有一個(gè)不等就可以了!

  所以簡(jiǎn)單來(lái)講,hashcode相當(dāng)于是一個(gè)對(duì)象的編碼,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比較起來(lái)不直觀。我們一般在覆蓋equals的同時(shí)也要 覆蓋hashcode,讓他們的邏輯一致。

  舉個(gè)例子,還是剛剛的例子,如果姓名和性別相等就算2個(gè)對(duì)象相等的話,那么hashcode的方法也要返回姓名 的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。

  要從物理上判斷2個(gè)對(duì)象是否相等,用==就可以了。

【java的hash Code的使用方法】相關(guān)文章:

Java使用方法集錦09-07

Java重載使用方法08-22

Java重載的使用方法09-13

java函數(shù)使用方法07-18

java語(yǔ)言super使用方法09-28

Java for循環(huán)語(yǔ)句的使用方法10-20

Java語(yǔ)言相關(guān)使用方法08-27

java File類的基本使用方法09-15

Java語(yǔ)言Math類的使用方法09-08