package cn.java.Mycollection;
/*
- 自定义一个HashMap
- 实现了put方法增加键值对,并解决了键重复时覆盖相应的节点
- 实现tostring方法,实现方便观看
- 根据键对象 获取value
*/
public class FanHashMap4<K,V> {
Node3[] table;//位桶数组
int size;//存放的键值对个数
public FanHashMap4() {
table=new Node3[16];//长度一般定义为2的整数幂
}
public V get(K key) {
int hash=myHash(key.hashCode(), table.length);
V value=null;
if (table[hash]!=null) {
Node3 temp=table[hash];
while(temp!=null) {
if (temp.key.equals(key)) {//如果相等 。则说明找到了键值对 则返回相应的value
value=(V) temp.value;
break;
}else {
temp=temp.next;
}
}
}
return value;
}
public void put(K key,V value) {
//定义了新的节点对象
Node3 newNode=new Node3();
newNode.hash=myHash(key.hashCode(), table.length);
newNode.key=key;
newNode.value=value;
newNode.next=null;
Node3 temp=table[newNode.hash];
Node3 iterLatNode3=null;//最后一个遍历的元素
boolean keyRepeat=false;
if (temp==null) {
//此处数组元素为空,则直接将新节点放进去
table[newNode.hash]=newNode;
size++;
}
else {
//此处元素不为空,则遍历对应链表
while(temp!=null) {
//判断key如果重复,则覆盖
if (temp.key.equals(key)) {
System.out.println("key重复了");
temp.value=value;
//只是覆盖value即可,其他value不变
keyRepeat=true;
break;
}else {
//key不重复,则遍历下一个
iterLatNode3=temp;
temp=temp.next;
}
}
if (!keyRepeat) { //如果没有发生可以重复的情况 。则添加到链表最后
iterLatNode3.next=newNode;
size++;
}
}
}
//如果要完善。还需要考虑数组扩容的问题
@Override
public String toString() {
// TODO Auto-generated method stub
//达到键值对效果
StringBuilder sb=new StringBuilder("{");
for (int i = 0; i < table.length; i++) {
Node3 tempNode3=table[i];
while (tempNode3!=null) {
sb.append(tempNode3.key+":"+tempNode3.value+",");
tempNode3=tempNode3.next;
}
}
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
}
public int myHash(int v,int length) {
//53 69 85
return v&(length-1);
}
public static void main(String[] args) {
FanHashMap4<Integer, String > map1=new FanHashMap4();
map1.put(10, "aa");
map1.put(20, "bb");
map1.put(30, "cc");
map1.put(60, "dd");
map1.put(20, "ee");
map1.put(53, "53g");
map1.put(85, "85g");
map1.put(69, "69g");
System.out.println(map1);
System.out.println(map1.get(53));
}
}