Hashmap


Hashmap

文章插图
Hashmap基于哈希表的 Map 接口的实现 。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键 。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同 。)此类不保证映射的顺序,特别是它不保证该顺序恆久不变 。此实现假定哈希函式将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能 。叠代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关係数)成比例 。所以,如果叠代性能很重要,则不要将初始容量设定得太高(或将载入因子设定得太低) 。
基本介绍中文名:哈希映射
外文名:hashMap
基于:哈希表的 Map 接口的实现
参数:初始容量 和载入因子
同步机制:此实现不是同步的
重要参数HashMap 的实例有两个参数影响其性能:初始容量 和载入因子 。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量 。载入因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度 。当哈希表中的条目数超出了载入因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数 。在Java程式语言中,载入因子默认值为0.75,默认哈希表元为101 。同步机制注意,此实现不是同步的 。如果多个执行绪同时访问一个哈希映射,而其中至少一个执行绪从结构上修改了该映射,则它必须 保持外部同步 。(结构上的修改是指添加或删除一个或多个映射关係的任何操作;以防止对映射进行意外的非同步访问,如下:Map m = Collections.synchronizedMap(new HashMap(...));叠代器由所有此类的“collection 视图方法”所返回的叠代器都是快速失败 的:在叠代器创建之后,如果从结构上对映射进行修改,除非通过叠代器本身的 remove方法,而不冒在将来不确定的时间发生任意不确定行为的风险 。注意,叠代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,编写依赖于此异常的程式的做法是错误的,正确做法是:叠代器的快速失败行为应该仅用于检测程式错误 。遍历Hash中的元素在Hash中可以直接使用以下方法遍历(所有键)KeySet然后通过键可以找出需要的值HashMap<String,String> mp = new HashMap<String,String>();for (String i : mp.keySet()) {     //String 是mp中的键的对应类型 i 是对应的KeySet中的每一个键值      System.out.println( mp.get(i)); }JAVA基本概念基于哈希表的 Map 接口的实现 。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键 。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同 。)此类不保证映射的顺序,特别是它不保证该顺序恆久不变 。另外,HashMap是非执行绪安全的,也就是说在多执行绪的环境下,可能会存在问题,而Hashtable是执行绪安全的 。设计思路此实现假定哈希函式将元素正确分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能 。叠代集合视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关係数)的和成比例 。所以,如果叠代性能很重要,则不要将初始容量设定得太高(或将载入因子设定得太低) 。HashMap 的实例有两个参数影响其性能:初始容量载入因子容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量 。载入因子是哈希表在其容量自动增加之前可以达到多满的一种尺度 。当哈希表中的条目数超出了载入因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍 。通常,默认载入因子 (.75) 在时间和空间成本上寻求一种折衷 。载入因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点) 。在设定初始容量时应该考虑到映射中所需的条目数及其载入因子,以便最大限度地降低 rehash 操作次数 。如果初始容量大于最大条目数乘以载入因子,则不会发生 rehash 操作 。如果很多映射关係要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关係能更有效地存储 。注意,此实现不是同步的 。如果多个执行绪同时访问此映射,而其中至少一个执行绪从结构上修改了该映射,则它