Node2.class
package cn.sxt.mycollection;
public class Node2<K,V> {
int hash;
K key;
V value;
Node2 next;
}
package cn.sxt.mycollection;
/**
*
* 自定义一个HashMap
* 实现:
* 存数据
* 取数据
* 重写toString
* 实现删除操作
* @author Administrator
*
*/
public class SxtHashMap<K,V> {
Node2[] table;//位桶数组
int size;//存放的键值对个数
public SxtHashMap() {
table =new Node2[16];//长度一般定义为2的整数幂
}
public void put (K key,V value) {
Node2 newNode=new Node2();
newNode.hash=myHash(key.hashCode(), table.length);
newNode.key=key;
newNode.value=value;
newNode.next=null;
Node2 temp=table[newNode.hash];
Node2 lastTemp=null;
boolean keyReplace=false;
if(temp==null) {
//此处数组元素为空,则直接将新节点放进去
table[newNode.hash]=newNode;
}else {
while(temp!=null) {
//当key值重复的时候,覆盖value即可
if(temp.key.equals(key)) {
temp.value=value;
keyReplace=true;
size--;
break;
}else {
lastTemp=temp;
temp=temp.next;
}
}
if(!keyReplace){
lastTemp.next=newNode;
}
}
size++;
}
public V getValue(K key) {
int hash =myHash(key.hashCode(),table.length);
V value=null;
Node2 temp=table[hash];
if(temp!=null) {
while(temp!=null) {
if(temp.key.equals(key)){
value=(V)temp.value;
break;
}else {
temp=temp.next;
}
}
}
return value;
}
public K getKey(V value) {
K key=null;
for(int i=0;i<=table.length-1;i++) {
Node2 temp=table[i];
while(temp!=null) {
if(temp.value.equals(value)) {
key=(K)temp.key;
break;
}
temp=temp.next;
}
}
return key;
}
public int myHash(int v,int length) {
return v&(length-1);//直接位运算,效率高
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder("{");
for(int i=0;i<=table.length-1;i++) {
Node2 temp=table[i];
while(temp!=null) {
sb.append(temp.key+":"+temp.value+",");
temp=temp.next;
}
}
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
}
public static void main(String[] args) {
SxtHashMap<Integer,String> m=new SxtHashMap<>();
m.put(10, "chaiyi");
m.put(20, "chaier");
m.put(30, "chaisan");
System.out.println(m);
m.put(20, "chainiang");
System.out.println(m);
System.out.println(m.getValue(20));
System.out.println(m.getKey("cahier"));
System.out.println(m.getKey("chaiyi"));
}
}
运行结果:
{20:chaier,10:chaiyi,30:chaisan}
{20:chainiang,10:chaiyi,30:chaisan}
chainiang
null
10