[英]The performance of the HashMap in JAVA8
我在java8中學習了HashMap源代碼時遇到了一個問題。
源代碼是如此復雜,效率有多大?
所以我寫了一個關於哈希沖突的代碼。
public class Test {
final int i;
public Test(int i) {
this.i = i;
}
public static void main(String[] args) {
java.util.HashMap<Test, Test> set = new java.util.HashMap<Test, Test>();
long time;
Test last;
Random random = new Random(0);
int i = 0;
for (int max = 1; max < 200000; max <<= 1) {
long c1 = 0, c2 = 0;
int t = 0;
for (; i < max; i++, t++) {
last = new Test(random.nextInt());
time = System.nanoTime();
set.put(last, last);
c1 += (System.nanoTime() - time);
last = new Test(random.nextInt());
time = System.nanoTime();
set.get(last);
c2 += (System.nanoTime() - time);
}
System.out.format("%d\t%d\t%d\n", max, (c1 / t), (c2 / t));
}
}
public int hashCode() {
return 0;
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof Test))
return false;
Test t = (Test) obj;
return t.i == this.i;
}
}
我在Excel中顯示結果。 在此處輸入圖像描述
我使用java6u45 java7u80 java8u131。
我不明白為什么java8的性能會如此糟糕
我正在嘗試編寫自己的HashMap。
我想在java8中學習HashMap哪個更好,但是我找不到它。
您的測試場景對於Java 8 HashMap
來說不是最佳的。 Java 8中的HashMap
通過對任何長度超過給定閾值的哈希鏈使用二叉樹來優化沖突。 但是,這僅在密鑰類型具有可比性時才有效。 如果不是那么測試的開銷實際上使得Java 8 HashMap
變得更慢。 (減速比我預期的要多......但這是另一個話題。)
更改您的Test
類以實現Comparable<Test>
...並且您應該看到當哈希沖突的比例足夠大時,Java 8的性能優於其他Java。
請注意,樹優化應被視為散列函數不執行的情況下的防御措施。 優化將O(N)
最壞情況性能轉化為O(logN)
最壞情況。
如果希望HashMap
實例具有O(1)
查找,則應確保對密鑰類型使用良好的哈希函數。 如果碰撞概率最小化,則優化沒有實際意義。
源代碼是如此復雜,效率有多大?
它在源代碼的注釋中進行了解釋。 也許Google可以為您找到的其他地方:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.