自定義資料結構 MyHashMap

2021-08-26 10:06:40 字數 1405 閱讀 7518

[size=medium]在學習了資料結構hashmap之後,自己也定義了乙個myhashmap,下面來解析一下myhashmap。[/size]

[size=x-large]1、實質為乙個陣列[/size]

[size=medium]我定義的myhashmap中所使用的資料結構是乙個陣列,資料都儲存在這個陣列中。當然你肯定有疑問,若是用這個陣列的話那得要多大的陣列才能放下那麼大的資料?別急,在下面的內容中我會來解答,o(∩_∩)o ~~[/size]

[size=x-large]2、hash函式[/size]

[size=medium] 作為一種資料結構,那必然是要有儲存資料的方法即我自己定義的put方法,它的作用就是根據傳入的key將value放在指定的位置,那怎樣才能將value放在指定位置呢?這還不簡單?陣列的下標不就可以作為key,這樣不就確定了位置了嘛,用這樣的方法處理少量資料或許還可以,但是若處理大批量的資料,那麼它的作用那就捉襟見肘了。所以這裡需要用到hash函式,它的作用就是經過一定的計算確定資料儲存的位置,我定義的hash函式是根據key物件的hashcode值然後與陣列的長度取餘,這樣就確定了資料要放在陣列的什麼位置了,這樣定義的陣列的長度就可以很小了。但是又生出乙個疑問,取餘的話必然會有相同的餘數,那麼怎樣儲存這兩個或多個在陣列上位置相同的資料呢?[/size]

[size=x-large] 3、鍊錶陣列[/size]

[size=medium]既然有多個資料在同一位置上,那麼將他們放入另乙個容器中,而陣列中儲存的是這個容器,那麼問題就解決了,在myhashmap中使用的容器是鍊錶,每當有乙個資料存進來時,若對應的位置上沒有資料,則新建乙個結點,將資料儲存進去,將結點儲存在陣列該位置上;若對應的位置上已有資料,則新建乙個結點,將資料儲存進去,並將該結點作為鍊錶的尾結點。這裡也有乙個問題,大家都知道乙個小煉表的查詢效率還行,但是乙個大煉表的查詢效率是很低的,隨著儲存的資料的增加,那必然導致鍊錶變大,那如何才能使其效率不是很低呢?[/size]

[size=x-large]4、裝載因子與rehash[/size]

[size=medium]要解決上面的問題需要用到裝載因子與rehash,那麼什麼叫做裝載因子與rehash呢?裝載因子就是乙個限制,它決定了這個陣列中能儲存多少資料,若是超過這個限制,那麼就需要rehash了,在myhashmap中,設定裝載因子為0.7。rehash是對超過裝載因子後的hashmap進行的處理,在myhashmap中的rehash為新建乙個長度為原長度的兩倍的陣列,並將原陣列中的資料重新經過hash函式計算,儲存進新的陣列中。其實這裡也體現了myhashmap的弊端,大資料轉移時這個操作的效率很低。[/size]

[size=x-large]5、總結[/size]

[size=medium]myhashmap實質為乙個鍊錶陣列,根據hash函式來儲存資料,根據裝載因子來確定是否要進行rehash。而弊端則是在將原陣列資料轉移到新陣列時的效率低。[/size]

資料結構 自定義佇列

用鍊錶建立佇列 public class linkqueueimplements queue public node e e public node override public string tostring private node head private node tail private...

資料結構 自定義線性陣列

package com.accp.list 介面 author administrator param public inte ce mylist package com.accp.list 實現list的增 刪 改 查操作 author administrator param public cla...

資料結構 自定義鍊錶

public class linkedlist public node e e public node override public string tostring private node dummyhead private int size public linkedlist 獲取鍊錶中的元素...