自己动手写HashMap

HashMap是基于哈希散列表实现,通过映射关系存储对象即key-value,并且key值不能具有重复的对象,因为假如具有相同的对象我们在调用get方法的时候不知道得到那个对象所对应的值。又因为如果想要实现key不能够重复我们就需要遍历map中的key值找到对应的entry对象修改value值。这就代表着需要大量的损耗来进行相关的遍历。所以jdk采用数组+链表实现。我们将对象存储在链表数组中。将key的hashcode码对数组的长度进行取余。并将余数作为数组的下标,然后遍历这个数组下标所以对应的链表。查看是否具有相关的key值,如果存在则直接覆盖,如果不存在则直接通过add方法添加。其相关实现如下:

public class MyHashMap {
    LinkedList[] lists=new LinkedList[999];
    public void add(Object key,Object value) {
        MyEntry entry=new MyEntry();
        entry.setKey(key);
        entry.setValue(value);
        int a=key.hashCode()%lists.length;
        System.out.println(a);
        if(lists[a]==null) {
            lists[a]=new LinkedList<>();
            lists[a].add(entry);
            return ;
        }
        else {
            for(int i=0;i<lists[a].size();i++) {
                if(((MyEntry)lists[a].get(i)).getKey().equals(key)) {
                    ((MyEntry)lists[a].get(i)).setValue(value);
                    return;
                }
            }
        }
        lists[a].add(entry);
    }
    public Object get(Object key) {
        
        int a=key.hashCode()%lists.length;
        for(int i=0;i<lists[a].size();i++) {
            if(((MyEntry)lists[a].get(i)).getKey().equals(key)) {
                
                return ((MyEntry)lists[a].get(i)).getValue();
            }
        }
        return null;
    }
    public Object  remove(Object key) {
        int a=key.hashCode()%lists.length;
        for(int i=0;i<lists[a].size();i++) {
            if(((MyEntry)lists[a].get(i)).getKey().equals(key)) {
                Object oldvalue=((MyEntry)lists[a].get(i)).getValue();
                List list= lists[a];
                list.remove(i);
                return oldvalue;
            }
        }
        return null;
    }
}

当然这是简易版本的哈希map,jdk中遍历采用迭代器。具体看迭代器那篇。

猜你喜欢

转载自blog.csdn.net/qq_35681797/article/details/82115413