日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)

發布時間:2024/2/28 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。