为什么我的HashMap实现要比Java慢很多;什么是HashMap?
在查看了源代码并观看了大量视频后,我自己实现了Java的为什么我的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) {
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这样的真实尺寸。