我们先看HashMap的文字描述部分
HashMap是基于哈希表实现的Map接口,相比于Hashtable,HashMap的key和value都可以为空,并且HashMap不是线程安全的,HashMap是无序的
我们在代码中分别测试下HashMap 和Hashtable
返回结果如下:表明Hashtable的key和value都不能为空
测试HashMap
返回结果如下:表明HashMap的key和value都可以为空
再看下面一段文字描述
一个HashMap实例有两个参数影响它的性能:初始容量和装载因子。容量是哈希表中桶的 数量,初始容量是哈希表创建时的容量。装载因子用来衡量HashMap满的程度,就是决定hash 表中用掉多少容量时,进行自动扩充容量的因子.当哈希表中entry的数量超过装载因子和当前容量的乘积时,哈希表内部结构将会重新构建,使得哈希表容量约是桶数量的两倍
默认装载因子0.75在时间和空间成本上之间提供了很好的折衷,更高的值减少了空间开销,但是增加了查找成本,当设定初始容量的时候,应考虑map中的预期数量和load factor.以便最小化rehash操作,如果初始容量大于最大条目数除以装载因子,rehash操作将不会发生。
如果map中要存储很多元素,应该设置容量大一点,以便调效率,而不是让它执行根据需要自动rehash哈希表。
如果多个key的hascode值相同,会降低哈希表的性能。
注意HashMap是不同步的,如果多线程在同时处理一个HashMap,外部必须做同步操作。一般,操作map需要一些同步对象来封装map.如果没有这样的对象,那么需要用synchronizedMap来封装
在迭代器查询期间,如果对map的数据结构进行操作,会抛出ConcurrentModificationException,除了使用iterators自己的remove方法
网友评论