为了春招,系统地复习一下Java相关的知识,应该不会写源码解析,完全是给自己看的,如果足够幸运,有幸进入大厂,重新写下给别人看的
注意点
-
HashTable和HashMap都实现了Map接口,所以需要对比着说
-
HashTable也是使用拉链法,即底层使用数组和链表实现哈希表.
-
默认值可能有些不同
- HashTable的底层数组的初始长度为11
- 负载因子一样,都是0.75
- 扩容大小是2倍旧长度+1
-
HashTable的hash算法和hashMap不同,是这样计算的
(hash & 0x7FFFFFFF) % tab.length
,tab就是底层数组,hash就是对象的hashcode值,说实话,不对这样的计算并不是很理解,就不卖弄了. -
说一下区别吧
- HashTable底层数组长度没有2的n次方的要求,看初始长度就知道了
- HashTable的键值都不允许为null,如果为null,会直接报空指针异常,而hashMap可以.
- HashTable是线程安全的,通过同步方法来实现,虽然都说多线程下使用HashTable代替hashMap,但是我并不喜欢HashTable,主要是它的锁粒度太大了,我觉得小程序还好,稍微要求并发量的程序可能都不能达到要求.
-
HashTable我没有说太多,一是我使用的很少,二是有些操作就是链表的操作,和我在HashMap中说的其实很象,可以看下这篇