這種映射的好處就是能夠把查找的時間複雜度下降到一個常數的水平。經常使用的一種哈希的實現方式就是使用一個鏈表的數組。由key對錶長取模獲得數組的下標。固然下標極可能會產生衝突。解決衝突的辦法有不少。這裏咱們使用的是鏈地址法。也就是若是下標是相同的,咱們就加到數組下標對應的鏈表中。node
package com.cbs.hash; /** * 定義哈希表的每個節點 * @author CBS * */ public class Node<K,V> { K key;//key值 V value;//value值 Node<K,V> next;//下一個節點 public Node(){ } public Node(K k,V v){ this.key=k; this.value=v; } } package com.cbs.hash; /** * 自定義哈希表 * @author CBS * */ public class MyHashTable<K,V> { private Node<K,V>[] table; private int count=0;//哈希表長度 private final float f=0.75f;//裝載因子 private int index;//數組下標 private int hash;//哈希值 //初始化數組長度 @SuppressWarnings("unchecked") public MyHashTable(){ table=new Node[9]; } /** * 添加方法 * @param key * @param value */ public void put(K key,V value){ hash=key.hashCode();//獲取哈希值 index = (hash & 0x7FFFFFFF) % table.length;//獲取下標值 Node<K,V> node=table[index]; Node<K,V> tem=node; //若是節點已經存在,更新value值 for(;tem!=null;tem=tem.next){ if(hash==tem.key.hashCode() && tem.key.equals(key)){ tem.value=value; return; } } Node<K,V> newNode=new Node<K, V>(key,value); //在鏈表的表頭插入 table[index]=newNode; newNode.next=node; count++; } /** * 查找指定key值下的節點 * @param k * @return key值對應的節點對象 */ public Node<K, V> find(K k){ hash=k.hashCode(); int index = (hash & 0x7FFFFFFF) % table.length; Node<K,V> node=table[index]; Node<K,V> tem=node; for(;tem!=null;tem=tem.next){ if(hash==tem.key.hashCode() && tem.key.equals(k)){ return tem; } } return null; } /** * 更新key值對應的value值 * @param k * @param v */ public void update(K k,V v){ Node<K,V> node=find(k); node.value=v; } /** * 刪除指定key值的節點 * @param k */ public void delete(K k){ hash=k.hashCode(); int index = (hash & 0x7FFFFFFF) % table.length; Node<K,V> node=table[index]; Node<K,V> tem=node; for(;tem!=null;tem=tem.next){ if(hash==tem.next.key.hashCode() && tem.next.key.equals(k)){ break; } } Node<K,V> nextNode=find(k); tem.next=nextNode.next; count--; } /** * 獲取key值節點下面的value值 * @param k * @return V類型的值 */ public V get(K k){ Node<K,V> Node=find(k); if(Node!=null){ return (V)Node.value; } return null; } public int size(){ return count; } }