av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Java實現(xiàn)簡易HashMap功能詳解

瀏覽:107日期:2022-09-02 08:51:35

本文實例講述了Java實現(xiàn)簡易HashMap功能。分享給大家供大家參考,具體如下:

創(chuàng)建節(jié)點類

節(jié)點類含有的屬性:鍵值對(value,key)以及指向下一節(jié)點的next;這些屬性的get以及set方法

代碼如下:

/** * 節(jié)點類 * @author HP * */public class Node { private Object value; private Object key; private Node next;/** * 空節(jié)點 */ public Node() { }/** * 值為key value的節(jié)點 * @param data */ public Node(Object key,Object value) {this.key = key;this.value = value; } //接下來就是一些數(shù)據(jù)和節(jié)點的set,get public Object getValue() {return value; } public void setValue(Object value) {this.value = value; } public Object getKey() {return key; } public void setKey(String key) {this.key = key; } public Node getNext() {return next; } public void setNext(Node next) {this.next = next; }}實現(xiàn)MyHash

實現(xiàn)MyHash的基本操作:

實現(xiàn)哈希表的基本存取運算

1.創(chuàng)建一個固定大小數(shù)組 2.將數(shù)組中的每個元素作為頭節(jié)點 存儲鍵值對 3.存數(shù):通過對key某種運算,計算出該數(shù)的哈希碼,將該哈希碼與數(shù)組做某種運算,得到該數(shù)在數(shù)組中的哪一個位置下的鏈表中 4.取數(shù):計算該數(shù)的哈希碼,然后同樣找到該數(shù)在數(shù)組中的位置,然后從該頭節(jié)點依次向下進(jìn)行比較得到該數(shù),不存在則返回null

HashMap的源代碼以及函數(shù)使用方法及返回值:

HashMap hash = new HashMap();hash.keySet()hash.hashCode() :返回int類型hash.put(Object key, Object value)hash.get(Object key)返回key值對應(yīng)的valuehash.remove(key) 返回對應(yīng)的valuehash.remove(key, value) 返回boolean是否remove成功hash.size() :返回int類型的存儲的節(jié)點的個數(shù)hash.containsKey(Object key) :booleanhash.containsValue(value) :booleanhash.values() :返回value集合hash.clear();hash.replace(key, oldValue, newValue) ???hash.replace(key, value) 將key對應(yīng)的oldvalue換為傳入的參數(shù)value,返回oldvaluehash.entrySet()hash.isEmpty()hash.equals(o):判斷兩個對象是否相等,看系統(tǒng)源代碼,可重寫

遍歷Iterator輸出的是所有節(jié)點對應(yīng)的value的值

存儲的東西越來越大,那么刪除插入操作越來越復(fù)雜,那么需要rehash(需要一個條件判斷是否需要rehash)

本次示例沒有編寫rehash函數(shù)。

MyHash代碼,注釋還比較詳細(xì),后邊還有測試代碼以及測試結(jié)果:

public class MyHash { //哈希數(shù)組的長度初始化為8 private int size = 8; private int number = 0;//存儲的節(jié)點的個數(shù) //哈希數(shù)組 private ArrayList<LinkedList> array_head = new ArrayList<LinkedList>(size);//構(gòu)造方法 public MyHash() {for(int i=0;i<size;i++) { LinkedList mylist = new LinkedList();//哈希數(shù)組中初始化存儲的為空鏈表頭 array_head.add(mylist);//初始化的時候就將空節(jié)點頭添加到數(shù)組中去} }/** * 根據(jù) 鍵值對 生成節(jié)點 * 將節(jié)點放入哈希表中 * @param key 鍵 * @param value 值 */ public void put(Object key,Object value) {if(number/size == 10) { rehash();}number++;Node new_node = new Node(key,value);//由傳入的參數(shù)生成新節(jié)點int code = hashcode(key.toString());//得到哈希碼int position = locate(code);//得到該哈希碼所對應(yīng)的哈希數(shù)組中的位置//找到該位置對應(yīng)的鏈表頭LinkedList list_head = (LinkedList) array_head.get(position);//將節(jié)點放入哈希表中l(wèi)ist_head.add(new_node); }/** * */ private void rehash() { } /** * @param key * @param value * @return 返回鍵值對應(yīng)得節(jié)點 */ public Object get(Object key) {int code = hashcode(key.toString());//得到哈希碼int position = locate(code);//得到該哈希碼所對應(yīng)的哈希數(shù)組中的位置//找到該位置對應(yīng)的鏈表LinkedList list_head = (LinkedList) array_head.get(position);//從頭遍歷鏈表 ,找到與鍵key對應(yīng)的節(jié)點的value值進(jìn)行輸出for(int i=0;i<list_head.size();i++) { //首先拿到頭節(jié)點 Node head = (Node) list_head.get(i); Node node = head; while(node!=null) {//如果 鍵 相等if(node.getKey().equals(key)) {// System.out.println('node.getValue() :'+node.getValue()); return node.getValue();}node = node.getNext(); }}return null;//否則返回空 }/** * 移除鍵為key的節(jié)點 * @param key * @return 返回刪除節(jié)點的key對應(yīng)的value */ public Object remove(Object key) {number--;int code = hashcode(key.toString());//得到哈希碼int position = locate(code);//得到該哈希碼所對應(yīng)的哈希數(shù)組中的位置//找到該位置對應(yīng)的鏈表LinkedList list_head = (LinkedList) array_head.get(position);//從頭遍歷鏈表 ,找到與鍵key對應(yīng)的節(jié)點的value值進(jìn)行輸出for(int i=0;i<list_head.size();i++) { //首先拿到頭節(jié)點 Node head = (Node) list_head.get(i); Node node = head; while(node!=null) {//如果 鍵 相等if(node.getKey().equals(key)) { Object value = node.getValue(); list_head.remove(node); return value;}node = node.getNext(); }}return null;//否則返回空 }public Object replace(Object key,Object newvalue) {System.out.println('replace');int code = hashcode(key.toString());//得到哈希碼int position = locate(code);//得到該哈希碼所對應(yīng)的哈希數(shù)組中的位置//找到該位置對應(yīng)的鏈表LinkedList list_head = (LinkedList) array_head.get(position);//從頭遍歷鏈表 ,找到與鍵key對應(yīng)的節(jié)點的value值進(jìn)行輸出for(int i=0;i<list_head.size();i++) { //首先拿到頭節(jié)點 Node head = (Node) list_head.get(i); Node node = head; while(node!=null) {//如果 鍵 相等if(node.getKey().equals(key)) { Object oldvalue = node.getValue(); node.setValue(newvalue); return oldvalue;}node = node.getNext(); }}return null;//否則返回空 }/** * @param key * @return 哈希表中含有該key,返回true */ public boolean containsKey(Object key) {int code = hashcode(key.toString());//得到哈希碼int position = locate(code);//得到該哈希碼所對應(yīng)的哈希數(shù)組中的位置//找到該位置對應(yīng)的鏈表LinkedList list_head = (LinkedList) array_head.get(position);//從頭遍歷鏈表 ,找到與鍵key對應(yīng)的節(jié)點的value值進(jìn)行輸出for(int i=0;i<list_head.size();i++) { //首先拿到頭節(jié)點 Node head = (Node) list_head.get(i); Node node = head; while(node!=null) {//如果 鍵 相等if(node.getKey().equals(key)) { return true;}node = node.getNext(); }}return false;//否則返回空 }public Object containsValue(Object value) {//找到該位置對應(yīng)的鏈表for(int k=0;k<size;k++) { LinkedList list_head = (LinkedList) array_head.get(k); //從頭遍歷鏈表 ,找到與鍵key對應(yīng)的節(jié)點的value值進(jìn)行輸出 for(int i=0;i<list_head.size();i++) {//首先拿到頭節(jié)點Node head = (Node) list_head.get(i);Node node = head;while(node!=null) {//如果 鍵 相等 if(node.getValue().equals(value)) {return true; } node = node.getNext();} }}return false;//否則返回空 }/** * 打印哈希表 */ public void show() {System.out.println('打印哈希表');for(int i=0;i<size;i++) { LinkedList list_head = array_head.get(i);//得到鏈表頭 System.out.println('鏈表 :'+(i+1)); for(int j=0;j<list_head.size();j++) {Node head = (Node) list_head.get(j);//取出每個節(jié)點Node node = head;while(node!=null) { //打印出每個節(jié)點得鍵值對 System.out.print('節(jié)點'+(j+1)+' :('+node.getKey()+':'+node.getValue()+')'+'-->'); node = node.getNext();} } System.out.println();}System.out.println(); }/** * * @return 返回存儲的節(jié)點的個數(shù) */ public int size() {return number; }/** * 清除哈希表中的所有元素 */ public void clear() {for(int i=0;i<size;i++) {LinkedList list_head = array_head.get(i);//得到鏈表頭 list_head.clear(); }number = 0; }/** * 計算字符串的哈希碼 * ASCII碼相加 * @param s * @return */ public int hashcode(String s) {int k = 0;for(int i=0;i<s.length();i++) { k += s.charAt(i);}return k; }/** * 得到哈希碼對應(yīng)在數(shù)組中的位置 * @param k * @return */ public int locate(int k) {int m = k%size;return m; }}測試代碼及結(jié)果

public class Test { public static void main(String[] args) {MyHash myhash = new MyHash();myhash.put('abc', 123);myhash.put('b', 2);myhash.put('c', 3);myhash.put('a', 1);myhash.put('d', 4);myhash.put('e', 5);myhash.put('f', 6);myhash.put('g', 7);myhash.put('h', 8);myhash.put('i', 9);myhash.put('j', 10);myhash.put('k', 11);myhash.put('l', 12);myhash.put('m', 13);System.out.println('myhash.get('g') :'+myhash.get('g'));System.out.println('myhash.size() :'+myhash.size());System.out.println('myhash.replace('m', 20) :'+myhash.replace('m', 20));System.out.println('myhash.containsValue(5) :'+myhash.containsValue(5));System.out.println('myhash.containsKey('g') :'+myhash.containsKey('g'));System.out.println('myhash.remove('j') :'+myhash.remove('j'));System.out.println('myhash.show()');myhash.show();myhash.clear();System.out.println('myhash.clear()');System.out.println('myhash.size() :'+myhash.size()); }}

Java實現(xiàn)簡易HashMap功能詳解

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設(shè)計有所幫助。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 亚洲视频在线看 | 欧美日韩中文字幕在线观看 | 黑人巨大精品欧美一区二区 | 久视频在线 | 亚洲视频在线视频 | 欧美午夜精品 | 黄色片中文字幕 | 在线a视频| 黄色午夜 | 午夜理伦三级理论 | 深夜福利网 | 欧美午夜在线观看 | 久久视频免费 | 伊人久久影院 | 手机看片1024日韩 | 久草免费福利视频 | 日韩欧美小视频 | 亚洲在线观看视频 | 国产一区视频在线播放 | 国产黄色免费看 | 国产一区免费 | 国产免费一区二区三区最新不卡 | 免费一区二区三区 | 黄色一级片免费看 | 国产一区二区三区在线 | 色精品 | 中文字字幕在线 | 午夜一级片 | 国语对白做受欧美 | 欧美日韩在线视频观看 | 日韩在线视频免费 | 一级特黄视频 | 日日不卡av | 午夜色婷婷 | 五月久久 | 国产一级免费视频 | 亚洲欧美另类在线观看 | 中文字幕少妇 | 精品免费在线观看 | 久久机热这里只有精品 | 在线免费看a |