通过了解HashMap类底层代码后,通过自己的理解手动完成HashMap中的主要方法,提高java基础。
/**
* 自定义HashMap
* 完成myHash函数实现计算hash值
* 完成put方法实现(核心方法)
* 重写toString 实现格式化输出
* 完成get方法(核心方法)
* 加入泛型
* @author yky
*
*/
class Node<k,v>{
//每个节点特定值
int hash;
k key;
v value;
Node next;
}
public class MyHashMep <k,v>{
Node[] table;//核心 位桶数组
int size;//键对个数
public MyHashMep(){
this.table=new Node[16];//默认大小
}
public void put(k key,v value) {
Node newNode=new Node();
newNode.hash=myHash(key.hashCode(),table.length);//当前hash值
newNode.key=key;
newNode.value=value;
newNode.next=null;
Node LastNode = null; //保存最后一个temp值
boolean isRepeat=false;
Node temp=table[newNode.hash];//取出当前hash值的最先节点
if(temp==null) {
table[newNode.hash]=newNode;
size++;
}else {
while(temp!=null) {
//判断key值相同要覆盖
//不等直接在后面添加新节点
if(temp.key.equals(key)) {
temp.value=value;//直接覆盖
isRepeat=true;
break;
}else {
LastNode=temp;
temp=temp.next;
}
}
if(!isRepeat) {
//如果没有发生重复加在最后
LastNode.next=newNode;
size++;
}
}
}
public int myHash(int v,int length) {
//实现hash值计算算法
return v&(length-1);
}
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int i=0;i<table.length;i++) {
Node temp=table[i];
while(temp!=null) {
sb.append(temp.key+":"+temp.value+",");
temp=temp.next;
}
}
return sb.toString();
}
public Object get(k key) {
int hash=myHash(key.hashCode(),table.length);
v value=null;
if(table[hash]!=null) {
Node temp=table[hash];
while(temp!=null) {
if(temp.key.equals(key)) {
//如果key相等说明找到了
value=(v)temp.value;
break;
}else {
temp=temp.next;
}
}
}
return value;
}
public static void main(String[] args) {
MyHashMep<Integer,String> msm=new MyHashMep<>();
msm.put(1, "123");
msm.put(2, "hhh");
msm.put(1, "432");
msm.put(5, "gg");
msm.put(21, "dd");
System.out.println(msm);
System.out.println(msm.get(21));
}
}
由于HashSet底层使用HashMap实现的所以只需要创建一个HashMap。
/**
* 有与HashSet底层就是靠HashMap实现所以只需要创建一个HashMap即可
* 完成HashSet基本功能
* @author yky
*
*/
public class MyHashSet {
HashMap hm;
public static final Object PRESENT=new Object();
public MyHashSet() {
hm=new HashMap();
}
public void add(Object obj) {
hm.put(obj, PRESENT);
}
public int size() {
return hm.size();
}
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("[");
for(Object key:hm.keySet()) {
sb.append(key+",");
}
return sb.toString();
}
public static void main(String[] args) {
MyHashSet hs=new MyHashSet();
hs.add("123");
hs.add("324");
hs.add("432");
System.out.println(hs);
}
}