为什么我的HashMap实现要比Java慢很多;什么是HashMap?

为什么我的HashMap实现要比Java慢很多;什么是HashMap?,java,hashmap,Java,Hashmap,在查看了源代码并观看了大量视频后,我自己实现了Java的HashMap。我只添加了关键方法,这就是我想到的: public class MyHashMap { private Node[] arr; private int n; public MyHashMap() { n = 16; arr = new Node[n]; } public void put(int key, int value) {

在查看了源代码并观看了大量视频后,我自己实现了Java的
HashMap
。我只添加了关键方法,这就是我想到的:

public class MyHashMap {

    private Node[] arr;
    private int n;

    public MyHashMap() {
        n = 16;
        arr = new Node[n];
    }

    public void put(int key, int value) {
        int index = key & (n - 1);

        if (arr[index] == null) {
            arr[index] = new Node(key, value);
        } else {
            Node node = arr[index];

            if(node.key == key) {
                node.value = value;
                return;
            }

            while (node.next != null) {
                if(node.key == key) {
                    node.value = value;
                    return;
                }

                node = node.next;
            }

            node.next = new Node(key, value);
        }
    }

    public int get(int key) {
        int index = key & (n - 1);

        if(arr[index] == null) {
            return -1;
        } else {
            Node node = arr[index];

            while(node != null) {
                if(node.key == key) {
                    return node.value;
                }
            }

            return -1;
        }
    }

    public void remove(int key) {
        int index = key & (n - 1);

        if(arr[index] == null) {
            return;
        } else {
            Node node = arr[index];

            if(node.next == null && node.key == key) {
                arr[index] = null;
                return;
            }    

            while(node.next != null) {
                if(node.key == key) {
                    node.next = node.next.next;
                    return;
                }
            }
        }
    }

    private class Node {
        int key, value;
        Node next;

        Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }    

}
我可以执行相对较小的命令,而不需要花费很长时间,如下所示:

MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);
hashMap.put(2, 2);
System.out.println(hashMap.get(1));            // returns 1
System.out.println(hashMap.get(3));            // returns -1 (not found)
hashMap.put(2, 1);          // update the existing value
System.out.println(hashMap.get(2));            // returns 1
hashMap.remove(2);          // remove the mapping for 2
System.out.println(hashMap.get(2));            // returns -1 (not found)

但一旦我做了更多的事情,就需要更长的时间。我试着看看Java的
HashMap
是否同样慢,但几乎不花时间。是什么让我的实现如此缓慢?这不仅仅是几毫秒,当我的命令没有那么多时,它会慢大约5秒。

只是为了学究,Java没有任何实现:它是一种有多种实现的语言规范。但是,如果您指的是openjdk,那么简单的答案是hashmap算法非常复杂:它包括自动扩展以及根据大小在冲突哈希上的树或链表。它有2000多行代码,多年来经过大量定制,以平衡内存和处理器效率。没有一个简单的解释可以解释为什么它更好。定义“更多”。对于16这样的小数组大小,您将在
N>16
之后立即停止散列并开始线性搜索。试试像32K这样的真实尺寸。