HashMap与Hashtable的区别
- Hashtable既不支持Null key也不支持Null value。
- HashMap和Hashtable底层都是使用数组加链表(在jdk1.8之后HashMap还使用了红黑树进一步提升存取效率)。
- HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null;。HashMap中插入key为null的键值对是会调用特定方法 putForNullKey,并且HashMap并不能使用get()方法来判断是否存在某个键 ,而是使用containsKey()来判断。
- HashMap是非线程安全的,Hashtable由于每个方法都有Synchronize关键字修饰所以是线程安全的,但效率低于HashMap,当对并发没有要求时推荐使用HashMap。当需要并发操作时推荐使用ConcurrentHashMap,因为其使用的分段锁在效率上比Hashtable高。
- HashMap初始容量16,之后的自动扩容为原来的2倍,Hashtable初始容量为11,之后每次扩容为之间2n+1,填充因子默认都为0.75。
- HashMap、Hashtable都使用了Iterator。HashMap的Iterator是fail-fast(快速失败模式)迭代器,当有其他线程改变了HashMap的结构(比如增删改元素)将会抛ConcurrentModificationException。但通过迭代器的remove()移除元素则不会,但这并不一定会发生,主要取决于JVM。
- HashMap计算hash对key的hashcode进行二次hash,获取更好的散列值,然后对table的数组长度取模;Hashtable直接使用key的hashcode对数组长度进行取模。