HashSet
如何获得初始容量?
import java.util.*;
import java.lang.reflect.Field;
public class Demo
{
static int getCapacity(ArrayList<?> l) throws Exception
{
Field dataField = ArrayList.class.getDeclaredField("elementData");
dataField.setAccessible(true);
return ((Object[]) dataField.get(l)).length;
}
public static void main(String args[])
{
ArrayList a = new ArrayList();
System.out.println(getCapacity(a));
HashSet h = new HashSet(); //in case HashSet what we do
System.out.println(h.capacity());
}
}
实际上,我们在HashSet
类中没有容量方法。那么我们如何得到HashSet
的容量呢?如何获取HashSet
对象的初始容量?
3条答案
按热度按时间e4yzc0pl1#
HashSet
不会暴露这些信息。如果需要,您可以自己设置初始容量(例如,HashSet h = new HashSet(22);
)。javadoc表示默认容量为16
。在内部,
HashSet
只是通过HashSet.map
字段 PackageHashMap
。我认为您可以使用反射来获取map
字段,然后询问它的初始容量。我不明白你为什么要这么做。zengzsys2#
我们不能直接检索HashSet对象创建后的初始容量,因为初始容量没有公开为公共方法或属性。HashSet类不提供方法来查询初始化时设置的初始容量。
t5fffqht3#
类似于问题中的代码已经为
ArrayList
做了什么;使用额外的步骤来检索存储在map
变量中的Map
:最终必须使用
--add-opens=java.base/java.util=ALL-UNNAMED
选项调用(请参见InaccessibleObjectException: module java.base does not "opens java.util" to unnamed module @61443d8f使用反射很容易破坏-它高度依赖于实现(例如
map
变量可以重命名或替换其类型)-基于OpenJDK 21的代码。