HashMap和Hashtable区别是什么?

简介: HashMap和Hashtable区别是什么?

HashMap 和 Hashtable 都实现了 Map 接口,都是 Java 中用于存储键值对的数据结构,它们的底层数据结构都是数组加链表的形式(默认情况下),但它们存在以下几点不同:

  1. 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
  2. 性能:因为 Hashtable 使用了 synchronized 给整个方法添加了锁,所以相比于 HashMap 来说,它的性能不如 HashMap。
  3. 存储:HashMap 允许 key 和 value 为 null,而 Hashtable 不允许存储 null 键和 null 值。

Hashtable 不能存储 null 键和 null 值是因为,它的 key 值要进行哈希计算,如果为 null 的话,无法调用该方法,还是会抛出空指针异常。而 value 值为 null 的话,Hashtable 源码中会主动抛出空指针异常。

HashMap 允许 key 和 value 为 null 的原因是因为在 HashMap 中对 null 值进行了特殊处理,如果为 null 时会把它赋值为 0,如下源码所示:

HashMap 和 Hashtable 基础使用

 

import java.util.HashMap;
import java.util.Hashtable;
 
public class HashtableDemo {
    public static void main(String[] args) {
        Hashtable<String, String> table = new Hashtable<>();
        table.put("A", "Apple");
        table.put("B", "Ball");
        table.forEach((k, v) -> System.out.println(k + " " + v));
 
        HashMap<String, String> map = new HashMap<>();
        map.put("A", "Apple");
        map.put("B", "Ball");
        map.forEach((k, v) -> System.out.println(k + " " + v));
    }
}

Hashtable 不推荐使用

虽然 Hashtable 是线程安全的,但在多线程环境下官方也不推荐使用 Hashtable,因为 Hashtable 是给整个方法添加 synchronized 来实现线程安全的,所以它的性能很差。官方推荐在多线程环境下,使用线程安全的 ConcurrentHashMap 来完成数据存储。

ConcurrentHashMap 锁粒度更细,在多线程环境下的性能表现更好。

相关文章
|
7月前
|
安全 Java
HashMap和Hashtable的区别
HashMap和Hashtable的区别
39 2
|
1月前
|
安全 算法
HashMap和Hashtable 的区别
HashMap和Hashtable 的区别
24 0
|
1月前
|
存储 容器
Hashmap1.7和1.8区别
Hashmap1.7和1.8区别
77 0
Hashmap1.7和1.8区别
|
1月前
|
存储 安全 Java
HashMap和HashTable的区别
HashMap和HashTable的区别
28 0
|
11月前
|
安全
HashMap 和 HashTable 的区别
HashMap 和 HashTable 的区别
98 0
|
存储 安全 Java
HashMap和Hashtable以及ConcurrentHashMap的区别
HashMap是在JDK1.2中引入的Map的实现类。
300 0
|
存储 安全 算法
HashMap和Hashtable的联系与区别
HashMap和Hashtable的联系与区别
143 0
HashMap和Hashtable的联系与区别
|
存储 安全
HashTable 与HashMap区别
HashTable 与HashMap区别
86 0
|
安全 Java
HashMap与HashTable的区别
HashMap与HashTable的区别
96 0
IntObjectHashMap和HashMap的区别?
IntObjectHashMap和HashMap的区别?
368 0
IntObjectHashMap和HashMap的区别?