手寫HashMap,實現put,get以及擴容

2021-08-04 02:28:23 字數 1743 閱讀 1378

public class myhashmap

public int gethash()

public void sethash(int hash)

public k getkey()

public void setkey(k key)

public v getvalue()

public void setvalue(v value)

public nodegetnext()

public void setnext(nodenext)

@override

public string tostring()

return stringbuffer.tostring();

} }/**

* 新增元素

* @param key

* @param value

*/public void put(k key,v value)

//根據hashcode取模算出陣列下標

// int i = hash % length;

// &運算代替取模

int i = hash & (length -1);//0000-1111 0-15

//判斷table[i]是否存在

if(null == table[i])elseelse

//判斷next

if((node.next.hash ==hash) && (node.next.key == key || (key != null && node.next.key.equals(key))))

node = node.next;}}

} size++;

if(size >= theshold) }

//擴容方法

private void resize()

for (int count = 0;; count++)

nodenext = oldnode.next;

//新table的下標

int i = oldnode.hash & (newcapacity -1);

oldnode.next = newtable[i];

newtable[i] = oldnode;

oldnode = next;

}} //替換table

table = newtable; }

/*** 獲取元素

* @param key

* @return

*/public v get(k key)

//根據hashcode取模算出陣列下標

// int i = hash % length;

// &運算代替取模

int i = hash & (table.length -1);//0000-1111 0-15

nodenode = table[i];

if(node == null)

//按斷key是否相等

if((node.hash == hash) && ((node.key == key) || (key != null && node.key.equals(key))))else

node = node.next;}}

} }@override

public string tostring()

} return stringbuffer.tostring(); }

}

手寫hashmap演算法

01.自定義乙個hashmap 02.實現put增加鍵值對,實現key重複時替換key的值 03.重寫tostring方法,方便檢視map中的鍵值對資訊 04.實現get方法,根據鍵物件獲取相應的值物件 05.封裝 增加泛型 06.remove方法 陣列擴容方法暫缺 07.remove方法已增加 p...

資料結構 手寫hashmap

define size 100 位址鏈個數,足夠大 class simhash public simhash simhash delete map 清除陣列 void insert int key,int value node p map hash key 確定位址鏈索引 node q new no...

使用鍊錶 陣列,手寫HashMap

在jdk1.7版本的hashmap 底層採用了鍊錶 陣列的方式實現資料的儲存及擴容等,在jdk1.8後hashmap的底層換為紅黑樹 陣列的方式。這邊以鍊錶 陣列的方式模仿原始碼寫乙個自己的簡易hashmap。其中初始容量設為的10,負載因子設定0.5,上面效果已有了擴容的效果。因為是基於鍊錶 陣列...