如何获得有关Java Hashmap上冲突次数的指标?

andandand:

我正在实现一个自定义哈希函数,如果我在HashMap存储桶中遇到许多冲突,我如何知道存储在存储桶中的元素有多少?

aioobe:

API中对此没有直接支持。table用于存储存储桶的成员变量甚至不是公共的,因此扩展类不会使您走得太远。

假设您正在评估哈希函数,而不在生产代码中执行此操作,则可以使用反射传递这些约束。

我设法打印了存储桶中的内容。从这一点上分析分布指标应该不难。这是代码:

测试驱动程序:

import java.lang.reflect.Field;
import java.util.*;

class Test {

    public static void main(String[] args) throws Exception {

        SubHashMap<String, Integer> map = new SubHashMap<String, Integer>();

        map.put("zero",  0); map.put("one",   1); map.put("two", 2);
        map.put("three", 3); map.put("four",  4); map.put("five", 5);
        map.put("six",   6); map.put("seven", 7); map.put("eight", 8);

        map.dumpBuckets();
    }

}

SubHashMap:

class SubHashMap<K, V> extends HashMap<K, V> {

    public void dumpBuckets() throws Exception {

        Field f = HashMap.class.getDeclaredField("table");
        f.setAccessible(true);

        Map.Entry<K, V>[] table = (Map.Entry<K, V>[]) f.get(this);

        Class<?> hashMapEntryClass = null;
        for (Class<?> c : HashMap.class.getDeclaredClasses())
            if ("java.util.HashMap.Entry".equals(c.getCanonicalName()))
                hashMapEntryClass = c;

        Field nextField = hashMapEntryClass.getDeclaredField("next");
        nextField.setAccessible(true);

        for (int i = 0; i < table.length; i++) {

            System.out.print("Bucket " + i + ": ");
            Map.Entry<K, V> entry = table[i];

            while (entry != null) {
                System.out.print(entry.getKey() + " ");
                entry = (Map.Entry<K, V>) nextField.get(entry);
            }

            System.out.println();
        }
    }
}

输出:

Bucket 0: 
Bucket 1: two 
Bucket 2: 
Bucket 3: seven five 
Bucket 4: 
Bucket 5: 
Bucket 6: 
Bucket 7: one 
Bucket 8: three 
Bucket 9: 
Bucket 10: 
Bucket 11: four 
Bucket 12: zero 
Bucket 13: 
Bucket 14: eight 
Bucket 15: six 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使zsh`run-help`忽略`sudo`并获得有关以下命令的帮助

如何通过history.pushState获得有关历史更改的通知?

如何获得有关隐式转换为较低精度的警告?

如何获得有关WebRTC PeerConnection的连接类型的信息?

在管道连接到gulp浏览器时,如何获得有关错误的通知?

我如何获得有关正在编写的模块的信息?

如何获得有关Android appcompat或支持库更新的通知?

文件写入期间磁盘已满。如何获得有关此的通知?

如何获得有关Maven / Gradle的第三方库更新的通知?

如何获得有关春季分页的下一页

无论如何,我可以获得有关vkimage的信息吗?

如何在Windows中获得有关cURL的帮助

如何获得有关某些StorageReference的子代的信息?

如何获得有关apt-get的install子命令的帮助?

我如何获得有关LoCo团队的更新?

如何获得有关网络数据使用情况的统计信息?

如何获得有关终端命令的帮助?

如何获得有关音频文件头的所有信息?

如何获取有关ZODB冲突错误的指标?

如何获得有关命令的特定选项的帮助

LinqPad:如何获得有关用户定义的程序集的帮助?

如何获得有关课堂方法的帮助

如何获得有关包装用途的有用且详细的说明?

我如何获得有关Facebook登录的更多信息

如何获得有关“ echo”或其他bash命令的帮助?

如何获得有关按钮点击的通知?

如何在paypal api中获得有关用户取消订阅的通知?

如何获得有关猫鼬错误消息的更多详细信息?

如何获得有关小部件上每个光标移动的通知?