1 HashMap和Hashtable的区别
a) 从继承角度看
HashMap继承自AbstractMap类, Hashtable继承自Dictionary类. 但两者都实现了Map接口.
b) 从锁,线程安全性的角度看
HashMap中的方法没有加synchronized关键字,因此是线程不安全的
Hashtable中的方法加了synchronized关键字,因此是线程安全的
以put方法为例
c) 从contains相关方法角度看
HashMap中没有contains方法,只有containsKey跟containsValue,因为contains容易引起误解
Hashtable中保留了contains方法,效果等价于containsValue
HashMap
Hashtable
contains相关方法测试
d) 从key value是否可以为null的角度看
HashMap允许key value出现null值,null作为key时候,只允许有一个,重复的null key对应的value会被覆盖
Hashtable中key value都不允许出现null
e) 从遍历的角度看
HashMap,Hashtable都可以用Iterator进行迭代,Hashtable还可以用Enumeration进行迭代。
HashMap可以使用entrySet的迭代器进行迭代
HashMap也可以使用keySet的迭代器进行迭代
Hashtable可以用keySet,entrySet的iterator进行迭代外,还可以用Enumeration进行迭代
hashtable的keys进行Enumeration迭代
hashtable的elements进行Enumeration迭代
f) 从计算hash值的角度看
HashMap的Hash值如果为null,那就是0,否则就是key的hashCode值与自己无符号右移16位后进行异或运算,可以让底层table数组的值分布的更加均匀。
Hashtable的hash值直接使用的对象key的hashCode
g) 从容量的角度看
HashMap的默认容量是16
Hashtable的默认初始容量为11
HashMap扩容时,容量变为原来的2倍
Hashtable扩容时,容量变为原来的2倍+1
HashMap要求底层数组table的容量为2的整数次幂
而Hashtable没有这要求