Java HashMap存储桶中的条目数

Java HashMap存储桶中的条目数,java,hashmap,bucket,Java,Hashmap,Bucket,有没有办法确定HashMap中有哪些bucket,以及它们包含多少条目?不是直接确定的:这是通过使用私有字段隐藏的实现细节 如果您可以访问JDK的源代码,那么可以使用反射API访问HashMap,这将让您获得存储桶计数和各个存储桶的内容。但是,您的代码是不可移植的,因为它会破坏库类的封装。不是直接的:这是通过使用私有字段隐藏的实现细节 如果您可以访问JDK的源代码,那么可以使用反射API访问HashMap,这将让您获得存储桶计数和各个存储桶的内容。但是,您的代码将是不可移植的,因为它会破坏库类的

有没有办法确定HashMap中有哪些bucket,以及它们包含多少条目?

不是直接确定的:这是通过使用私有字段隐藏的实现细节


如果您可以访问JDK的源代码,那么可以使用反射API访问
HashMap
,这将让您获得存储桶计数和各个存储桶的内容。但是,您的代码是不可移植的,因为它会破坏库类的封装。

不是直接的:这是通过使用私有字段隐藏的实现细节


如果您可以访问JDK的源代码,那么可以使用反射API访问
HashMap
,这将让您获得存储桶计数和各个存储桶的内容。但是,您的代码将是不可移植的,因为它会破坏库类的封装。

您可以通过反射来实现,但它非常特定于jdk。这一个适用于小型映射Java8,但当映射变大时可能会中断,因为我相信Java8在存储桶变满时使用混合机制

private void buckets(HashMap<String, String> m) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    // Pull out the table.
    Field f = m.getClass().getDeclaredField("table");
    f.setAccessible(true);
    Object[] table = (Object[]) f.get(m);
    int bucket = 0;
    // Walk it.
    for (Object o : table) {
        if (o != null) {
            // At least one in this bucket.
            int count = 1;
            // What's in the `next` field?
            Field nf = o.getClass().getDeclaredField("next");
            nf.setAccessible(true);
            Object n = nf.get(o);
            if (n != null) {
                do {
                    // Count them.
                    count += 1;
                } while ((n = nf.get(n)) != null);
            }
            System.out.println("Bucket " + bucket + " contains " + count + " entries");
        }
        bucket += 1;
    }
}

public void test() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    HashMap<String, String> m = new HashMap<>();
    String[] data = {"One", "Two", "Three", "Four", "five"};
    for (String s : data) {
        m.put(s, s);
    }
    buckets(m);
}

您可以通过反射来实现,但它非常特定于jdk。这一个适用于小型映射Java8,但当映射变大时可能会中断,因为我相信Java8在存储桶变满时使用混合机制

private void buckets(HashMap<String, String> m) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    // Pull out the table.
    Field f = m.getClass().getDeclaredField("table");
    f.setAccessible(true);
    Object[] table = (Object[]) f.get(m);
    int bucket = 0;
    // Walk it.
    for (Object o : table) {
        if (o != null) {
            // At least one in this bucket.
            int count = 1;
            // What's in the `next` field?
            Field nf = o.getClass().getDeclaredField("next");
            nf.setAccessible(true);
            Object n = nf.get(o);
            if (n != null) {
                do {
                    // Count them.
                    count += 1;
                } while ((n = nf.get(n)) != null);
            }
            System.out.println("Bucket " + bucket + " contains " + count + " entries");
        }
        bucket += 1;
    }
}

public void test() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    HashMap<String, String> m = new HashMap<>();
    String[] data = {"One", "Two", "Three", "Four", "five"};
    for (String s : data) {
        m.put(s, s);
    }
    buckets(m);
}

hashmap->keyset->lenght?@FranMontero这会给你所有的钥匙,OP要求buckets@asdfzcx这个链接可以帮助你找到hashmap->keyset->lenght?@FranMontero这会帮你找到所有的键,OP要求buckets@asdfzcx这个链接可以帮助你