温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java 手工实现HashMap

发布时间:2020-07-04 19:16:27 来源:网络 阅读:299 作者:wx5d21d5e6e5ab1 栏目:编程语言
import java.util.HashMap;
import java.util.Map;

public  class test<K,V> {

node[] table;//核心位桶数组
int size; //存放的键值对数

public test(){
    table =new node[16];  //长度是2的整数幂

}
public void put(Object key,Object value)  //定义节点对象
{
    node newnode=new node();
    newnode.hash=myHash(key.hashCode(),table.length);
    newnode.key=key;
    newnode.value=value;
    newnode.next=null;

    node temp=table[newnode.hash];
    boolean flag=false;
    node nodelast=null;//正在遍历的最后一个元素
    if(temp==null)  //数组此处为空,则直接放新节点
    {
        table[newnode.hash]=newnode;
    }
    else //若不为空,则遍历链表,如果重复则替换,不重复则添加到后面
    {

        while(temp!=null)
        {
            if(temp.key.equals(key))  //如果键重复,只需要改变value
            {
                flag=true;
                System.out.println("key重复了");
                temp.value=value;
                break;
            }
            else
            {
            nodelast=temp;    //当temp为空时,保存最后一个元素
            temp=temp.next;   
            }
        }
        if(flag==false)
        {
            nodelast.next=newnode;
        }

    }
    size++;
}

public int myHash(int v,int length)  //得到Hash值,根据传入键值和数组长度计算Hash值
{
    System.out.println(v&(length-1));
    return v&(length-1);
}

public V get(K key)  //获得键对应的值,通过键的Hash值找到数组对应位置,再遍历链表查找键对应的值
{
    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))
            {
                value=(V) temp.value;
                break;
            }
            temp=temp.next;
        }
    }
    return (V)value;
}
public int getSize()  //返回键值对个数
{
    return size;
}
public String toString()  //重写toString方法
{
    StringBuilder s= new StringBuilder();
    s.append("{");
    for(int i=0;i<table.length;i++)  //遍历数组
    {
        node temp=table[i];
        while(temp!=null)   //遍历数组对应位置的链表
        {
            s.append(temp.key+":"+temp.value+",");

            temp=temp.next;    //HashMap存储是相当于在数组的对应位置存储一个链表

        }
    }
    s.setCharAt(s.length()-1,'}');
    return s.toString();
}

public static void main(String[] args)
{
    test<Integer,String> t =new test<>();
    t.put(10, "ad");
    t.put(19, "aa");
    t.put(8, "add");
    t.put(3,"ff");
    System.out.println(t);

    System.out.println(t.get(19));
    System.out.println(t.getSize());
}

}

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI