HashMap类翻译

HashMap是基于哈希表实现的Map接口,它提供了所有可选的Map操作,并允许null值和null键。HashMap类与Hashtable类类似,但是它是非同步的,并允许null值。HashMap类不保证Map的顺序,特别是它不保证顺序会随时间保持不变。

HashMap类提供了基本操作(get和put)的常数时间性能,假设哈希函数将元素适当地分散在桶中。对集合视图的迭代需要与HashMap实例的“容量”(桶的数量)加上其大小(键值映射的数量)成比例的时间。因此,如果迭代性能很重要,就非常重要不要将初始容量设置得太高(或负载因子太低)。

HashMap实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量是哈希表创建时的容量。负载因子是允许哈希表在其容量自动增加之前变得多满的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,哈希表将被重新哈希(即内部数据结构将被重建),以便哈希表具有大约两倍的桶数。

通常情况下,缺省的负载因子(0.75)在时间和空间成本之间提供了良好的平衡。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put)。在设置初始容量时,应考虑映射中的预期条目数和其负载因子,以最小化重新哈希操作的数量。如果初始容量大于条目数除以负载因子的最大值,则永远不会发生重新哈希操作。

如果要存储许多映射到HashMap实例中,使用足够大的容量创建它将允许映射比让它按需执行自动重新哈希更有效地存储。请注意,使用许多具有相同hashCode()的键是减慢任何哈希表性能的一种确定的方法。为了缓解影响,当键是可比较的时,这个类可以使用键之间的比较顺序来帮助打破平局。

请注意,这个实现是不同步的。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部同步它。结构修改是添加或删除一个或多个映射的任何操作;仅仅改变一个实例已经包含的键的值不是结构修改。这通常通过在自然封装映射的某个对象上同步来实现。如果不存在这样的对象,则应使用Collections.synchronizedMap方法“包装”映射。最好在创建时完成,以防止意外的非同步访问映射:

Map m = Collections.synchronizedMap(new HashMap(...));

这个类的所有“集合视图方法”返回的迭代器都是快速失败的:如果在迭代器创建后的任何时候以任何方式(除了迭代器自己的remove方法)结构性地修改了映射,则迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是冒着在未来的某个不确定的时间面临任意的、非确定性的行为的风险。

请注意,迭代器的快速失败行为不能保证,因为在不同步的并发修改存在的情况下,通常是不可能做出任何硬性保证的。快速失败迭代器尽力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序是错误的,迭代器的快速失败行为应该仅用于检测错误。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Map接口是基于哈希表实现的,这个实现为map提供了许多操作方法,允许key是null,或者values是null...
    彰德俊阅读 2,350评论 0 0
  • 源码是最好的教程,它比你想象中还详细的解读的类的原理. 我就从源码注解的来看一下HashMap的底层原理。你可以在...
    DeppWang阅读 4,449评论 0 1
  • Base on Java8 简介 HashMap是基于哈希表实现的映射(map)。此实现提供了所有可选映射操作,并...
    坠尘_ae94阅读 2,118评论 0 1
  • 一、HashMap概述 HashMap基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用nul...
    小陈阿飞阅读 3,780评论 0 2
  • Java集合:HashMap源码剖析 一、HashMap概述 二、HashMap的数据结构 三、HashMap源码...
    记住时光阅读 4,005评论 2 1