【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)
生活随笔
收集整理的這篇文章主要介紹了
【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
HashMap
HashMap存儲的是:鍵值對 (key, value)
HashMap的Key可以沖突,在沖突時,覆蓋原有的Key對應的Value值。
下面是一個Key沖突的例子,運行效果如下:
目標位置相同時,節點形成鏈表。如下
代碼(一共三個版本,最終版在最下面)
- 版本一:put方法
MyHashMap.java
package cn.hanquan.file;public class MyHashMap {Node[] table;// 位桶數組int size;// 存放鍵值對的個數public MyHashMap() {table = new Node[16];}public void put(Object key, Object value) {// 定義新節點對象Node newNode = new Node();newNode.hash = myHash(key.hashCode(), table.length);newNode.key = key;newNode.value = value;newNode.next = null;Node temp = table[newNode.hash];// 用來檢查位置是否被占用Node last = null;// 臨時存儲上一個節點if (temp == null) {// 未占用table[newNode.hash] = newNode;} else {// 被占用while (temp != null) {if (temp.key.equals(key)) {// 重復System.out.println("key重復: key=" + key + ",value=" + value);temp.value = value;// 覆蓋value, 而hash, key, next保持不變return;} else {// 不重復last = temp;// 小弟踩著大哥腳印temp = temp.next;// 大哥先走一步}}last.next = newNode;}}public static void main(String[] args) {MyHashMap h = new MyHashMap();System.out.println("長度:" + h.table.length);h.put(10, "aa");h.put(20, "bb");h.put(30, "cc");h.put(20, "ssss");System.out.println("執行完畢");}// 計算放入那個桶public int myHash(int v, int length) {System.out.println("hash=" + (v % length));return v % length;} }Node.java
package cn.hanquan.file;public class Node {int hash;Object key;Object value;Node next; }- 版本二:添加 toString 方法
Node.java
package cn.hanquan.file;public class Node {int hash;Object key;Object value;Node next; }MyHashMap.java
package cn.hanquan.file;/** 實現put方法,增加一個元素* 實現toString方法,仿版查看map中的鍵值對信息*/ public class MyHashMap {Node[] table;// 位桶數組int size;// 存放鍵值對的個數public MyHashMap() {table = new Node[16];}public void put(Object key, Object value) {// 定義新節點對象Node newNode = new Node();newNode.hash = myHash(key.hashCode(), table.length);// System.out.println("key=" + key + "hashCode=" + key.hashCode());newNode.key = key;newNode.value = value;newNode.next = null;Node temp = table[newNode.hash];// 用來檢查位置是否被占用Node last = null;// 臨時存儲上一個節點if (temp == null) {// 未占用table[newNode.hash] = newNode;} else {// 被占用while (temp != null) {if (temp.key.equals(key)) {// 重復System.out.println("key重復: key=" + key + ",value=" + value);temp.value = value;// 覆蓋value, 而hash, key, next保持不變return;} else {// 不重復last = temp;// 小弟踩著大哥腳印temp = temp.next;// 大哥先走一步}}last.next = newNode;}}public String toString() {StringBuilder sb = new StringBuilder("{");for (int i = 0; i < table.length; i++) {Node temp = table[i];while (temp != null) {// 遍歷鏈表sb.append("[" + i + "]" + temp.key + "->" + temp.value + ",");// 不糾結最后多余的逗號,后面直接替換成}就行temp = temp.next;}}sb.setCharAt(sb.length() - 1, '}');return sb.toString();}public static void main(String[] args) {MyHashMap h = new MyHashMap();System.out.println("長度:" + h.table.length);h.put(10, "aa");System.out.println(h.toString());h.put(20, "bb");System.out.println(h.toString());h.put(30, "cc");System.out.println(h.toString());h.put(20, "dd");System.out.println(h.toString());h.put(53, "ee");System.out.println(h.toString());h.put(69, "ff");System.out.println(h.toString());h.put(85, "gg");System.out.println(h.toString());}// 計算放入那個桶public int myHash(int v, int length) {// System.out.println("hash=" + (v % length));return v % length;} }運行結果
長度:16
{[10]10->aa}
{[4]20->bb,[10]10->aa}
{[4]20->bb,[10]10->aa,[14]30->cc}
key重復: key=20,value=dd
{[4]20->dd,[10]10->aa,[14]30->cc}
{[4]20->dd,[5]53->ee,[10]10->aa,[14]30->cc}
{[4]20->dd,[5]53->ee,[5]69->ff,[10]10->aa,[14]30->cc}
{[4]20->dd,[5]53->ee,[5]69->ff,[5]85->gg,[10]10->aa,[14]30->cc}
- 版本三:增加 get 方法
Node.java
package cn.hanquan.file;public class Node {int hash;Object key;Object value;Node next; }MyHashMap.java
package cn.hanquan.file;/** 實現put方法,增加一個元素* 實現toString方法,仿版查看map中的鍵值對信息* 實現get方法,通過鍵對象查找相對應的值對象*/ public class MyHashMap {Node[] table;// 位桶數組int size;// 存放鍵值對的個數public MyHashMap() {table = new Node[16];}public void put(Object key, Object value) {// 定義新節點對象Node newNode = new Node();newNode.hash = myHash(key.hashCode(), table.length);// System.out.println("key=" + key + "hashCode=" + key.hashCode());newNode.key = key;newNode.value = value;newNode.next = null;Node temp = table[newNode.hash];// 用來檢查位置是否被占用Node last = null;// 臨時存儲上一個節點if (temp == null) {// 未占用table[newNode.hash] = newNode;size++;} else {// 被占用while (temp != null) {if (temp.key.equals(key)) {// 重復System.out.println("key重復: key=" + key + ",value=" + value);temp.value = value;// 覆蓋value, 而hash, key, next保持不變return;} else {// 不重復last = temp;// 小弟踩著大哥腳印temp = temp.next;// 大哥先走一步}}last.next = newNode;size++;}}public String toString() {StringBuilder sb = new StringBuilder("{");for (int i = 0; i < table.length; i++) {Node temp = table[i];while (temp != null) {// 遍歷鏈表sb.append("[" + i + "]" + temp.key + "->" + temp.value + ",");// 不糾結最后多余的逗號,后面直接替換成}就行temp = temp.next;}}sb.setCharAt(sb.length() - 1, '}');return sb.toString();}public Object get(Object key) {int hash = MyHashMap.myHash(key.hashCode(), table.length);Node t = table[hash];while (t != null) {if (key == t.key)return t.value;elset = t.next;}System.out.println("你要查找的key不存在!");return null;}public static void main(String[] args) {MyHashMap h = new MyHashMap();h.put(10, "aa");h.put(20, "bb");h.put(30, "cc");h.put(20, "dd");h.put(53, "ee");h.put(69, "ff");h.put(85, "gg");System.out.println(h.toString());System.out.println(h.get(30));}// 計算放入那個桶public static int myHash(int v, int length) {// System.out.println("hash=" + (v % length));return v % length;} }總結
以上是生活随笔為你收集整理的【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java爬虫】我的第一个爬虫 -- 简
- 下一篇: Java 把一个InputStream转