HashMap和HashTable都实现了Map接口
在API文档中有这样一段描述
The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.
就是说HashMap大致上和HashTable大致相同,除了HashMap是不同步的,并且允许空值null。
综合一下,HashMap和Hashable有以下区别:
- 版本不同,HashMap是JDK1.2,HashTable是JDK1.0
- 继承不同,HashMap继承自AbstractMap实现了Map接口,HashTable继承自Dictionary实现了Map接口
- HashMap允许空值,HashTable不允许空值和空键(编译可以通过,运行抛空指针异常)
- HashMap是线程不同步的,效率高、线程不安全,HashTable是线程同步的,效率低但是线程安全
HashMap底层的数据结构还是哈希表:顺序表+链表 存储过程如下
- 计算哈希码值(hash.code(),结果是一个int值,整数的hash码取自己即可)
- 根据哈希码调用哈希函数,计算得出数据在哈希表中的存储位置
- 该位置为空,直接存放;不为空,调用equals方法与已经存在的值对比,相同则替换,不同则以链表方式继续往后面存放
- 顺序表默认容量(桶的个数)是16,默认装填因子是0.75
- 哈希函数的选择:直接定址法,平方取中法,折叠法,除留取余法
- 注意JDK1.8开始当链表内个数达到8个时,会转为红黑树,目的是为了减少对比