欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

容易理解的简单的HashMap实现

程序员文章站 2022-03-02 09:41:18
...

创建最简单的hashmap实现,希望能分享给跟我一样的小白理解一下链表和数组如何实现HashMap。(扩容就不写了,红黑树不会,有问题麻烦指正别让我误导别人o.o)

package www.nz.HashMapTest;

//定义你的结点,采用泛型类让数据的类型能变得更多
class Node<K,V>{
    K k;
    V v;
    Node<K,V> next;

    //构造器,将存的值变成结点
    public Node(K k, V v, Node<K, V> next) {
        this.k = k;
        this.v = v;
        this.next = next;
    }
}

class HashMapDemo<K,V> {
    //定义数组长度
    private final int SIZE = 16;
    //创建结点的表
    private Node<K,V> table[] = new Node[SIZE];

    //存放数据的方法,存入的值就是键值对
    public void put(K k,V v){
        //将它变成一个结点
        Node<K,V> node = new Node(k,v,null);
        //将你的k值跟数组长度取模,得到你的数应该放在数组里的那个索引处
        int index = (node.k).hashCode() %  (table.length -1);
        //在对应索引处判断是否为空,是空最好,直接存放
        if (table[index] == null){
            table[index] = node;
            return;
        }else {
            //不是则遍历链表,从链表头开始遍历
            Node temp = table[index];
            while (temp != null){
                //要是有一样的k值之后,将它的value值替换,k对象不是基本类型或者String要重写equals和hashcode方法
                if (temp.k.equals(node.k)){
                    System.out.println("这是被覆盖的值:"+ temp.v);
                    temp.v = node.v;
                    return;
                }
                temp = temp.next;
            }
            //没有k重复则直接放,这是放在了头部,也可以放在尾的,这个遍历起来会先放后遍历
            node.next = table[index];
            table[index] = node;
        }
    }


    //查看元素
    public void view(){
        //简单的从数组从第一个链表遍历到最后一个链表
        for (int i = 0; i < table.length; i++) {
            Node temp = table[i];
            while (temp != null){
                System.out.println(temp.v);
                temp = temp.next;
            }
        }
    }

    //取值
    public void getValue(K k){
        //由k值得到它该存的数组索引位置,遍历链表查找是否有无k值一样,有则输出value,没有则返回失败
        int index = k.hashCode() % (table.length -1);
        Node temp = table[index];
        while (temp != null){
            if (temp.k.equals(k)){
                System.out.println("这是" + k +  "的值:"+ temp.v);
                return;
            }
            temp = temp.next;
        }
        System.out.println("没有该值!");
    }

    //删除方法
    public void delete(K k){
        int index = k.hashCode() % (table.length -1);
        //当要删除的是链表的第一个一个结点时,处理方法不一样,利用的依旧是链表的增删改查
        if (table[index].k.equals(k)) {
            table[index] = table[index].next;
            System.out.println("删除成功!");
            return;
        }
        Node temp = table[index];
        while (temp.next != null){
            if (temp.next.k.equals(k)){
               temp.next = temp.next.next;
                System.out.println("删除成功!");
               return;
            }
            temp = temp.next;
        }
        System.out.println("删除失败!");
    }
}

//测试程序
public class MyHashpMap {
    public static void main(String[] args) {
        HashMapDemo hmd = new HashMapDemo();
        hmd.put(1,"aa");
        hmd.put(2,"bb");
        hmd.put(3,"cc");
        hmd.view();
        System.out.println("==========");
        hmd.put(1,"aaa");
        hmd.view();
        System.out.println("==========");
        hmd.put(1,"aa - 1");
        hmd.view();
        System.out.println("===========");
        hmd.put(16,"aa - 2");
        hmd.put(31,"aaaa");
        hmd.put(46,"aa - 3");
        hmd.put(17,"bbb");
        hmd.put(32,"bbbb");
        hmd.put(47,"bbbbb");
        hmd.view();
        hmd.getValue(2);
        System.out.println("============");
        hmd.delete(47);
        hmd.delete(2);
        hmd.view();
    }
}

 

相关标签: java