雜湊的價值在於速度:雜湊使得查詢得以快速進行。由於速度的瓶頸是對「鍵」的查詢,因此解決的方案之一就是保持「鍵」的排序狀態,然後使用collections.binarysearch進行查詢。雜湊則更進一步,他將「鍵」儲存在某處,使你能夠快速找到。儲存一組元素最快的資料結構是陣列,所以使用他來代表「鍵」的資訊(注意:是「鍵」的資訊,而不是「鍵」本身)。但是陣列有乙個特性:一旦分配,容量就不能改變。因此我們就有乙個問題:我們需要在map中儲存任意數量的「值」,但是如果「鍵」的數量被陣列容量限制了,該怎麼辦呢?
答案就是:陣列並不儲存」鍵「本身。而是通過」鍵「物件生成乙個數字,將其作為陣列的下標索引。這個數字就是雜湊碼,由定義在object中的hashcode生成(也稱雜湊函式)。你的類總是應該過載hashcode方法。為解決陣列容量被固定的問題,不同的」鍵「可以產生相同的下標。也就是說,可能會有衝突(collision)。因此陣列多大就不重要了,每個」鍵「總能在陣列中找到他的位置。
於是查詢乙個」值「的過程首先就是計算雜湊碼,然後使用雜湊碼查詢陣列。如果保證沒有衝突(如果」值「的數量是固定的,就有可能),那你可就有了乙個完美的雜湊函式,但是這種情況很特殊。通常,衝突是由」外部鏈結(external chaining)「處理:陣列並不直接儲存「值」,而是儲存「值」的list。然後對list中的「值」使用equals方法進行現行查詢。這部分的查詢自然比較慢。但是,如果有好的雜湊函式,陣列的每個位置就只有較少的「值」。因此,不是查詢所有的list,而是快速跳到陣列的某個位置,只對很少的元素進行比較。這就是hashmap會如此快的原因。
hashmap的效能因子:
容量(capacity):雜湊表中桶的數量
初始化容量(initial capacity):建立雜湊表時桶的數量。hashmap和hashset都允許你在構造器中制定初始化容量。
尺寸(size):當前雜湊表中記錄的數量。
負載因子(load factor):等於「size/capacity」。等於零,表示空的雜湊表,0.5表示半滿的雜湊表。輕負載的雜湊表具有衝突少、適宜插入與查詢的特點(但是使用迭代器遍歷會變慢)。hashmap和hashset都允許你在構造器中指定負載因子,當負載到達指定值時,容器會自動成倍的增加容量,並將原有的物件重新分配,存入新桶中(成為「重雜湊」rehashing)。
雜湊表C 提高查詢速度
一,雜湊表 hashtable 簡述 在.net framework中,hashtable是system.collections命名空間提供的乙個容器,用於處理和表現類似key value的鍵值對,其中key通常可用來快速查詢,同時key是區分大小寫 value用於儲存對應於key的值。hashta...
提公升查詢速度的MySQL注意事項
1 不要在where子句中的 左邊進行函式 算數運算或其他表示式運算,否則系統將可能 2 應盡量避免在where子句中使用!或 操作符,否則將引擎放棄使用索引而進行全表掃瞄 3 應盡量避免在where子句中對字段進行null值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id f...
如何將你的 MySQL 查詢速度提公升 300 倍
在進行效能分析前,需要先定位耗時查詢。mysql提供了內建的耗時查詢日誌。使用前,開啟my.cnf檔案,將slow query log設定為 on 同時將long query time設定為乙個對一次查詢來說比較慢的時間 秒數 比如0.2。slow query log file設定為你想儲存日誌檔案...