【发布时间】:2015-03-02 00:37:26
【问题描述】:
这是“Using Java 7 HashMap in Java 8”的后续问题。有许多有趣的 cmets。有些我很理解;其他人少。
为什么这个hashCode() 方法被认为很差?
乍一看,我认为这是合理的。也许 17 可以增加到 31。否则,它似乎遵循来自Arrays.hashCode(Object[]) 的普遍接受的公式。一种猜测:它适用于项目数量相对较少(小于 10.000)的一般情况,但对于非常大的集合(1.000.000 或更多)表现不佳。
这是原始代码:(全部包含在内以提供一些上下文。)
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Test1 {
static int max_k1 = 500;
static int max_k2 = 500;
static Map<Node, Node> map;
static Random random = new Random();
public static void main(String[] args) {
for (int i = 0; i < 15; i++) {
long start = System.nanoTime();
run();
long end = System.nanoTime();
System.out.println((end - start) / 1000_000);
}
}
private static void run() {
map = new HashMap<>();
for (int i = 0; i < 10_000_000; i++) {
Node key = new Node(random.nextInt(max_k1), random.nextInt(max_k2));
Node val = getOrElseUpdate(key);
}
}
private static Node getOrElseUpdate(Node key) {
Node val;
if ((val = map.get(key)) == null) {
val = key;
map.put(key, val);
}
return val;
}
private static class Node {
private int k1;
private int k2;
public Node(int k1, int k2) {
this.k1 = k1;
this.k2 = k2;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + k1;
result = 31 * result + k2;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Node))
return false;
Node other = (Node) obj;
return k1 == other.k1 && k2 == other.k2;
}
}
}
【问题讨论】:
标签: java performance hashmap hashcode