Почему моя реализация HashMap намного, намного медленнее, чем Java HashMap? - PullRequest
2 голосов
/ 24 февраля 2020

Я сделал собственную реализацию 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 секунд медленнее, когда мои команды не так уж и много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...