筆者認爲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”
注:如有不對之處請指出。