- 第一种回答方式:直接说两个容器的特点。
- HashMap和HashTable都是Map接口的实现类,都是存储键值对的值。 只是HashTable是Java1.0就出现的。实例化对象时默认就创建长度11的数组。里面方法都是使用synchronized修饰的。每次扩容2倍+1,最大上限Integer最大值减8。
- Hash冲突只有链表。如果新增时key或value为null都会出现空指针异常。而HashMap是Java 1.2才出现的。
- 从Java8开始,实例化时不会创建底层数据,在新增时在创建。所有方法都是非线程安全的。数组容量尽量保持是2的N次方法。初始默认大小16。最大上限2的30次方。如果新增时key和value都允许为null。
- 第二种回答方式:提取出区别,在说针对这点两个容器的区别进行解释
- HashMap和HashTable都是Map接口的实现类,都是存储键值对的值。主要区别包含这样的几点:
- 第一点:出现的版本不同:HashTable是JDK 1.0就出现的,HashMap是JDK 1.2出现的。
- 第二点:实例化时是否创建底层数组:HashTable 实例化时就会创建底层数组,HashMap只有在第一次新增时才会实例化底层数组。
- 第三点:底层数组初始容量不同:HashTable底层数组默认初始容量为11,HashMap底层数组默认初始容量为16.
- 第四点:是否是线程安全的:HashTable中get、remove、put都是用synchronized进行修饰。而HashMap没有使用synchronized修饰
- 第五点:扩容后大小不同:HashTable每次扩容2倍+1,而HashMap每次扩容2倍;
- 第六点:最大大小不同。HashTable底层数组最大大小int最大值减8,而HashMap最大容量为2的30次方。
- 第七点:底层结构不同。HashTable是数组+链表。HashMap是数组+链表+红黑树。
- 第八点:是否允许为null。HashTable中key和vlaue都不允许为null,为null时出现空指针异常。HashMap中key和value都允许为null。