
HashMap是一种基于哈希表的Map接口实现,它提供了所有可选映射操作,并允许使用null值和null键。除了非同步和允许使用null之外,HashMap与Hashtable非常相似。
HashMap并不保证映射的顺序,特别是该顺序不会恒久不变。哈希函数会将元素适当地分布在各桶之间,为基本操作(get和put)提供稳定的性能。迭代collection视图所需的时间与HashMap实例的容量(桶的数量)和大小(键-值映射关系数)成比例。
HashMap有两个参数影响其性能:初始容量和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作,即重建内部数据结构,从而哈希表将具有大约两倍的桶数。
默认加载因子为0.75,在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash操作次数。
如果很多映射关系要存储在HashMap实例中,则相对于按需执行自动的rehash操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。
HashMap不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则需要保持外部同步。
由所有此类的“collection视图方法”所返回的迭代器都是快速失败的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的remove方法,其他任何时间任何方式的修改,迭代器都将抛出ConcurrentModificationException。