Java手写简单HashMap一(包括增加,查找,toString,泛型)

@Java 300 学习总结

HashMap底层采用实现采用了哈希表,结合了“数组和链表”。
原理如图

一、定义HashMap类。

首先需要定义一个节点来存储数据,构成链表结构。

public class Node {
    int hash;
    Object key;
    Object value;
    Node next;
}
public class ggHashMap {
    Node[] table; //位桶数组,用于存放链表的第一个节点
    int size;
    public ggHashMap() {
        super();
        table = new Node[16]; //默认初始为16
    }

    public static void main(String[] args) {
        ggHashMap m1 = new ggHashMap();
        System.out.println();
    }
}

二、实现put方法,往HashMap里添加元素

每一个节点存放进HashMap里,首先根据key继续Hash值,以此确定插入的位置。


public int myHash(int v,int length) {
        return v&(length -1);//根据Hash值与位桶数组长度,进行位运算,保证插入元素的随机
                                    //位运算与取模运算效果相同,但是效率更高
    }
    
public void put(Object key, Object value) {
        Node newNode = new Node();
        newNode.hash = myHash(key.hashCode(),table.length); 
        //根据key的值取hash值,hashCode()为对象默认存在的方法
        newNode.key = key;
        newNode.value = value;
        newNode.next = null;
        
        Node temp = table[newNode.hash];//指向要插入的数组位置
        Node iterLast = null;//正在遍历的最后一个元素
        boolean keyRepeat = false;//判定元素key值是否相同被覆盖
        if(temp == null) { //数组元素为空
            table[newNode.hash] = newNode;
        }
        else { //不为空的情况
            while(temp!=null) { //遍历该链表
        
                //判断key是否重复
                if(temp.key.equals(key)) {
                    keyRepeat = true;
                    temp.value = value;
                    break; //找到重复结束遍历
                }else {
                    iterLast = temp; //iterLast跟着temp向后移一位
                    temp = temp.next;
                }
            }
            if(!keyRepeat) {
                iterLast.next = newNode; //没有发现重复,最后一位的next,指向新节点
            }
        }
    }

三、实现toString方法

利用可以自动扩增的StringBuilder对象,遍历每个节点,可实现数据的HashMap的字符串。

public String toString() {
        StringBuilder sb = new StringBuilder("{");
        for(int i = 0;i < table.length;i++) {
            Node temp = table[i];
            while(temp!=null) {
                sb.append(temp.key+":"+temp.value + ",");
                temp = temp.next;
            }
        }
        sb.setCharAt(sb.length()-1, '}');//将最后一个,号,转为}
        return sb.toString();
    }

四、实现get方法,根据key获得value

根据key值计算hash数值,指针指向数组索引值和hash值相等的节点,遍历该节点的链表,找到key值相等的节点,返回value值

public Object get(Object key) {
        int hash = myHash(key.hashCode(), table.length);
        Object value = null;
        Node temp = table[hash];
        while(temp!=null) {
            if(temp.key.equals(key)) {
                value = temp.value;
                break;
            }else {
                temp = temp.next;
            }
        }
        return value;
    }

五、增加泛型

public class Node2<K,V> {
    int hash;
    K key;
    V value;
    Node2 next;
}
public class ggHashMap4<K,V> {
    public V get(K key) {

}
    public void put(K key, V value) {

}
    }

猜你喜欢

转载自www.cnblogs.com/gg12138/p/11588456.html