Java 源码学习之java.util.Hashtable
Hashtable
是Java
编程中较为常用的容器类之一,在面试时常常被与HashMap
作比较!
为什么要常与HashMap
作比较呢?因为他们的源码是极其相似啊,网上也常常有人说HashMap
是基于Hashtable
实现的吧,因为Hashtable
在Java1.0
中就有了,但是HashMap
在Java1.2
才出现。
本文讲解Hashtable
时不再累赘,实现的原理大致都和HashMap一样,这里主要讲Hashtable
与HashMap
几个不同点。
不支持null
我们知道HashMap
是支持null
的键和值的,每次遇到null
时直接用0来作桶号,来看下Hashtable
对null
的处理
1 | /** |
可以很显眼的看到当value == null
会抛NPE异常,那key == null
源码中可没写上,其实该判断时在key.hashCode()
,而Object.hashCode
是不支持null
的,也就自然而来得Hashtable
不支持null
的键和值了
线程安全
在Hashtable
中的绝大部分方法都是使用synchronized
进行修饰的,这一点和HashMap
有较大的不同,虽然说Hashtable
的方法在多线程是安全的,但是和Vector一样,在多线程下使用时也要再看是否还额外需要synchronized
再修饰。
求余取桶号
在HashMap
中是根据key
的hash
值和table.length
进行与操作来求桶号的,并且要求table.length必须是2的幂次方,但是在HashMap
中的实现是使用hash
和table.length
求余来实现,在对table.length
的值并无其他要求,这种方法实现简单,但是效率没有HashMap
的高,毕竟求余除法操作要比与操作慢。1
int index = (hash & 0x7FFFFFFF) % tab.length;
总结
其实要总结的都在上面说了,Hashtable
与HashMap
主要的几个不同就是:
Hashtable
不支持null
的键和值Hashtable
是线程安全的Hashtable
是用过求余来取桶号的
本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言。