HashTable 与HashMap区别
1.HashTable 线程是安全的
2.HashMap 线程是不安全
3.HashMap 允许存放key值 null 存放在 index=0位置
4.HashTable 不允许存放key为null
1,HashMap实现不同步,线程不安全。 HashTable线程安全 HashMap中的key-value都是存储在Entry中的。
2,继承不同。
3, Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
4, Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键, 而应该用 containsKey() 方法来判断。
5,哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值
为什么不使用HashTable
HashTable 底层 通过 synchronized 保证线程安全性问题
保证线程安全性问题---加上锁---发生锁的竞争。
HashTable 当多个线程 在访问 get或者put操作的时候会发生this锁的竞争,多个线程竞争锁 最终只会有一个线程获取到this锁,获取不到的this锁 可能会阻塞等待。最终将我们的 HashTable 中 get 或者put方法改成单线程执行 效率是非常的低。
在多线程的情况下 不推荐使用 HashTable ConcurrentHashMap
1.使用传统HashTable保证线程问题,是采用synchronized锁将整个HashTable中的数组锁住,在多个线程中只允许一个线程访问Put或者Get,效率非常低,但是能够保证线程安全问题。
2.Jdk官方不推荐在多线程的情况下使用HashTable或者HashMap,建议使用ConcurrentHashMap分段HashMap,效率非常高。