1.HashMap允许key和value都为空,HashMap是线程不安全的。HashTable中的key和value都不能为空。HashTable是线程安全的。
2.HashMap中桶的概念:在jdk1.7中,HashMap是由数组和链表组成的。数组的每个索引被称作桶。
3.为什么在jdk1.7中,HashMap是由数组和链表组成的?
4.如果散列函数将元素均匀的分布在桶中,如:put和get方法的时间复杂度为常量。对hashMap迭代的时间为桶的数量+键值对的数量。
5.影响HashMap性能的两个因素:初始容量和负载因子。容量就是哈希表中桶的数量。初始容量就是哈希表创建时的容量。负载因子就是描述扩容前的最大存储量的程度。比如初始容量16和负载因子0.75,当数组的元素超过16*0.75=12时,就要进行扩容操作。哈希表容量时原来的2倍。哈希表会重新hash。重新hash的意思就是重新计算存储数据的存储位置。
6.负载因子默认是0.75,0.75是时间和空间的一个折中,是统计出来的结果。如果高于0.75,降低了空间开销,但是增加了查询的开销。
7.HashMap不是同步的。所以当多个线程访问同一个HashMap时,至少有一个现在对HashMap做了结构性的修改,在外部就要进行同步。有一种方法是在创建HashMap对象的时候,同步——Map m = Collections.synchronizedMap(new HashMap(...))。(结构性修改是指添加或者删除多个映射。如果仅仅改变vaule值,不改变key值,这种情况不是结构性修改。)
8.如果获得一个集合类的迭代器后,再在集合类本身做一些结构性的修改,比如remove操作,则会报ConcurrentModificationException异常。解决办法:通过迭代器进行结构性的修改,而不是通过集合类本身。在并发修改的情况下,迭代器会快速地失败。
以上是在HashMap的类注释中获得的信息。