(java 必備知識之三) 淺談java散列原理,爲什麼java需要散列集合?

  筆者認爲java知所已要使用散列集合,是因爲java中的集合需要更快的查詢效率。大家都聽說過一句“古話”:爲了速度而散列。 這其實

 

已經告訴我們散列的作用。有很多人都忽略了散列的重要性,只是把他當成一個集合中對像的唯一標識。其實不然。

 

那麼散列在java中主要體現在哪裏呢?

 

    爲什麼需要散列

 

 如果有一羣小豬,比方說有20只小豬。它們重量都非常接近,現在如果把他們放到一個豬圈裏,你如果想要找到一個10公斤的那隻小豬,

 

那是多麼難的一件事情。你非得一個個稱一下,直到找到你要找的那隻小豬。(10公斤的那隻)

 

  但是如果我構造20個豬欄來放置這20只小豬,並且每隻小豬都設置一個hashcode值,這個值分別對應豬欄,然後把符合hashcode值的

 

小豬分別放在不同的欄裏,這樣1只小豬一個欄。像貼了標籤一樣。當你要找10公斤的那隻小豬時,只需要按標籤找就能快速的索引到了,

 

這時我們就可以把hashcode當成是一個記錄的索引。散列的原理也是如此。

 

 衆所周知的hash算法

 

衆所周知的hash算法也是如此,就是在一個散列表裏添加記錄的索引來快速索引與定位數據。所以java中的散列集合也就是這麼產生的。

 

致於如何加速索引,還需要有合適的hashcode算法,在存放大數據集的時候若hashcode太過分散,散列過大也會造成性能的影響。影響

 

數據的索引定位。你構造20個豬欄沒問題,成本也不見得多。但是如果是叫你構造1W或是更多的豬欄來存放小豬時,這時你的成本就大

 

了。所以說不同的應用需要選用合適的hashcode算法就是這樣的道理。

 

java中的常用散列集合如下:

 

java中常用的散列集合如:hashtable,hashmap,hashset 等。

 

java中的散列集合的Hashcode

 

hashcode 方法本爲Object 中的方法,這裏利用Set集合來做舉例,它充分體現了Hashcode的作用,Set是屬於無序集合,裏面的元素

 

是不可以重複的。這個應該誰都知道。那麼它是如何把重複元素去除的呢?Set集合對象在add時,先執行hashcode方法。並根據這個

 

hashcode值去Set集合裏面查找該對象。如果Set集合中沒有該hashcode指向,則開闢一個空間把這個對象存進來。那麼add中的size

 

就+1。但是如果根據這個hashcode去查找Set集合中的對像,該hashcode值所指向的空間已存放了一個對像。那麼就會去執行該對象的

 

equals方法。 比較兩個相同hashcode值的對象。是否爲同一對像(這裏就需要我們覆蓋之用了,默認是比較兩個對像的引用是否一致,

 

如果一致),如果返回true則表明兩個對象是同一對象。這時Set集合就不再放置這個對象到集合列表中了。相返,如果返回false就表明兩

 

個對象是屬於有相同hashcode的非同一對象。這時對像也就被Set集合存起來了。所以在java有句話:“有相同hashcode值的對象

 

equals不一定相等,而equals相等的兩個對象,有相同的hashcode”

 

 

 

 

注:如有不對之處請指出。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章