自定义实现HashMap底层的

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));
	
	
	
	
	
	
	
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值