在程式設計中hashmap是一種強大的資料結構,可以說是程式設計利器,下面是我自己寫的簡易版hashmap。
public class myhashmap;
transient entry table = (entry) empty_table;
// 鍵值對數量
transient int size;
// 載入因子
int threshold;
float loadfactor = 0f;
// 預設初始化容量
static final int default_initial_capacity = 1 << 4;
// 載入因子
static final float default_load_factor = 0.75f;
// 最大容量
static final int maximum_capacity = 1 << 30;
public myhashmap()
// 想hashmap中放入元素
public v put(k key, v value)
// 計算key值得hashcode值
int hash = hash(key);
int i = indexfor(hash, table.length);
/*** 如果重複新增資料則覆蓋,如果hash值相同的,也同樣遍歷之後進行修改
*/for (entrye = table[i]; e != null; e = e.next)
} addentry(hash, key, value, i);
return null;
} private void addentry(int hash, k key, v value, int i)
//createentry(hash, key, value, i);
} private void createentry(int hash, k key, v value, int bucketindex)
// 擴容
private void resize(int i)
/*** 將舊桶中的資料移入新桶
* * @param newtable
* @param b
*/private void transfer(entry newtable, boolean flag)
} }private int indexfor(int h, int length)
final int hash(object k)
private void inflatetable(int tosize)
/*** 桶
*/static class entry
// 獲得key值
public final k getkey()
// 獲得value值
public final v getvalue()
public final v setvalue(v newvalue)
public final int hashcode()
public final string tostring()
}}
寫的很粗糙,甚至可能有bug,但是基本邏輯不變,hashmap的實現原理是操作內部靜態類(k,v)泛型結構的,初始容量是16,當執行插入資料時,實際是向entry型別的陣列中插入資料,一樣運用了擴容演算法,容量如果不夠的話,其基本理念是計算key的hash值,然後計算出儲存位置,最後向陣列中插入資料,如果key值計算相同,但是實際儲存值不同的話,那麼還是在相同位置處插入資料,entry型別實際是乙個單向鍊錶,總的來說hashmap=陣列+鍊錶,至於載入因子,閥值等概念讀者可以自已去了解,也無非使效能更趨於合理,下圖是視覺化的一種表示: 資料結構 順序表(初學者簡易版)
剛接觸資料結構,看書太著急,一上來就被各種自定義的變數和函式搞得一懵一懵的 目前順序表剛剛入門,花了兩天寫了乙個順序表的基礎版本 對於初學者應該是比較通俗易懂的了 歡迎各位大佬指錯督促,謝謝你們 ps 以下順序表包含操作有 建立 初始化查詢 插入刪除 include include define m...
星雲鏈Nebulas資料彙總(簡易版)
以下的資料基本都源自於星雲nebulas官網,都是有關技術方面的資料。我只是做個搬運工,方便各位喜歡區塊鏈技術的大神查閱,節約時間。後續我還會不斷更新。謝謝。星雲官方中文電報群 星雲官方英文電報群 english group t.me nebulasio 星雲推特 2 星雲鏈技術 解讀 demo 鐘...
C 之簡易版商品管理系統(非常簡易)
主函式 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 簡易版商品管理系統 catch exception...