是否应该使用自定义Java HashMap大小?

时间:2014-02-17 06:25:02

标签: java hashmap

我正在开发一个Minecraft PvP mod,并希望使用hashmap将每个玩家的名字存储在他们的团队中。他们在一场比赛中总共有64名球员,而且一次只能在服务器上进行一场比赛。

我是否需要使用64个插槽的散列图?在过去,我很难理解哈希图是如何工作的,我现在开始理解它。

3 个答案:

答案 0 :(得分:2)

不,如果您未指定任何内容,HashMap将自动增加大小,以使其加载因子保持在默认值0.75之下。即使您没有明确地对其进行任何操作,您的HashMap也会在填充时增长,同时如果不使用所有64个条目则保持适当的小。

你想要以初始容量指定的原因实际上就是你事先知道你要用至少那么多条目来填充它,这样你就不必重新分配和重新分配正在填补它。

简而言之:如果您只是将HashMap保留为默认值,那么通常都可以。 :)

答案 1 :(得分:1)

在Java中,默认加载因子为0.75,哈希映射的默认初始容量为16.

hashmap的初始值集如下:

DEFAULT_INITIAL_CAPACITY = 16; 
DEFAULT_LOAD_FACTOR = 0.75; 
THRESHOLD = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR;

哈希映射会自动将哈希映射的内容重新整理为具有更大容量的新数组。当哈希映射中的数据数超过THRESHOLD时会发生这种情况。每次调整大小都会导致容量增加16 * 0.75,32 * 0.75,64 * 0.75。

简单来说,您应该将其初始化为类似

的内容
int capacity = (int) ((your_data)/0.75+1);
HashMap<String, Integer> myHashMap = new HashMap<String, Integer>(capacity);

在您的情况下 your_data = 64

此外,您可以简单地实例化默认的hashmap,它总是调整自身的大小,但它没有提供与正确初始化相同的良好性能。

您可以阅读有关相同内容的上一篇文章 Best way to initialize a HashMap

答案 2 :(得分:0)

具有64个插槽会增加冲突的可能性,因为很可能多个键将映射到同一个插槽。最好使用标准的HashMap。或者,如果您真的关心空间,您还可以使用二叉树等数据结构,并按字母顺序排列玩家的名字,包括节点中的团队名称。二进制树查找比HashMap查找更大的数量级,但仍然非常快。