HashMap 桶中的条目数
Number of entries in HashMap bucket
有没有办法确定我们在 HashMap
中有哪些存储桶,以及它们包含多少条目?
不直接:这是通过使用私有字段隐藏的实现细节。
如果您可以访问您的 JDK 的源代码,您可以使用 反射 API 访问您的 [=] 的 private variables 10=],这将使您获得桶计数和各个桶的内容。但是,您的代码将不可移植,因为它会破坏库的封装 class.
您可以通过反思来完成,但它非常 jdk 具体。这个适用于小地图 Java 8 但当地图变大时可能会中断,因为我相信 Java 8 在桶变满时使用混合机制。
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);
}
打印:
Bucket 7 contains 2 entries
Bucket 13 contains 2 entries
Bucket 14 contains 1 entries
有没有办法确定我们在 HashMap
中有哪些存储桶,以及它们包含多少条目?
不直接:这是通过使用私有字段隐藏的实现细节。
如果您可以访问您的 JDK 的源代码,您可以使用 反射 API 访问您的 [=] 的 private variables 10=],这将使您获得桶计数和各个桶的内容。但是,您的代码将不可移植,因为它会破坏库的封装 class.
您可以通过反思来完成,但它非常 jdk 具体。这个适用于小地图 Java 8 但当地图变大时可能会中断,因为我相信 Java 8 在桶变满时使用混合机制。
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);
}
打印:
Bucket 7 contains 2 entries
Bucket 13 contains 2 entries
Bucket 14 contains 1 entries