HashMap
Hash Table实现了Map接口。HashMap提供了所有可选的map操作,并且允许key或者value为null;(HashMap与HashTable相差不多,除了HashMap是不同步的与运行null值)。HashMap不能保证map中的顺序;尤其是不能保证某固定时间段内的顺序。
如果hash函数将元素正确的分散在hash桶内,那么hashMap里的基本的操作(get和put)将具有同等的时间效能。集合视图的便利花费的时间需要与HashMap的容量成正比,容量是HashMap的实例(桶数)加大小(key-value的映射数)。因此如果迭代器的性能很重要,那么设置一个不太高的初始容量(或者不太低的负载因子)是很关键的。
HashMap的实例有两个参数去影响它的性能:初始容量和负载因子。容量是哈希表中的桶的数量,初始容量只是创建哈希表中的容量。负载因子是描述当哈希表多满的时候运行其扩展其容量。当哈希表中的条目数大于了负载因子与容量的乘积,哈希表会重新散列,以便于哈希表有是之前的两倍的桶容量。
通常而言,默认的负载因子(0.75)在时间和空间的花费上是个不错的选择。更高的值求降低空间开销,但是会增加查找的成本(反应在大部分的操作上包括get和put)。为了进行最少的重新散列的操作,当设置初始容量的时候,应该烤炉与预计放入的数量与负载应酬这两个数字。如果初始容量比最大条目数除以负载因子大。那么不会发生重新散列的操作。
如果有大量的的映射将被存在HashMap的实例中,那么存入一个具有足够大容量的map中将比让其自动重新散列效率要高。注意使用大量具有相同hashCode的keys时将会当日任何哈希表的效率变慢。为了改善影响,当key时可以比较的,HashTable可能使用key的比较顺序来打破联系。
注意:HashMap是不同步的。如果多个线程同时访问一个HashMap,并且至少一个线程修改了map的结构,那么必须在HashMap外做同步操作。(修改结构是任何增加删除一个或多个映射的操作;仅仅是修改一个早已包含的的key对value的映射是不算修改结构的。)通常通过同步一些被自然封装在map里的对象来实现。如果没有这样的对象存在,那么map应该被包装的使用Collections.synchronizedMap方法。最好在创建时完成,以避免意外的不同步的访问map
Map m = Collections.synchronizedMap(new HashMap(…));