作者博客@Stone原地址
HashMap和Hashtable都实现了Map接口 但决定用哪一个之前先要弄清楚它们之间的分别
- 主要的是线程安全性,同步(synchronization),以及速度
区别
HashMap是非synchronized的,并可以接受null (HashMap可以接受为null的键值(key)值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;
而HashMap如果没有正确的同步的话,多个线程是不能共享HashMap的
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
重要的说一下他们存储空值出现的问题
- Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有添加空值得操作,编译是会通过,但是在运行的时候就会,抛出NullPointerException异常,这是JDK的规范规定的。
HashMap中,null可以作为键,但是null的key键只能有一个
- 而这个时候要注意,不能用get()方法,来判断 HashMap中是否存在某个键, 而应该用containsKey()方法来判断
他们哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
- hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
- 而HashMap重新计算了key的hash值 (!这里我也不知道对不对)
内部实现使用的数组初始化不同
- HashTable在不指定容量的情况下的默认容量为11,而HashMap为16
如何让HashMap 安全列?
- 最好,也是最常用的是,让HashMap的线程安全,那就给它加死锁(同步)
思维导图如下(作者博客@Stone原地址):