HashMap 和 Hashtable 将键值对存储在哈希表中。使用 Hashtable 或 HashMap 时,我们指定一个用作键的对象以及要链接到该键的值。然后对键进行哈希处理,得到的哈希码用作表中存储值的索引。现在让我们通过一个例子来讨论。
哈希图与哈希表
- HashMap 不同步。它不是线程安全的,如果没有正确的同步代码,就不能在多个线程之间共享,而 Hashtable 是同步的。它是线程安全的,可以与多个线程共享。
- HashMap 允许一个空键和多个空值,而 Hashtable 不允许任何空键或值。
- 如果不需要线程同步,则 HashMap 通常优于 HashTable。
Difference Between Hashmap and Hashtable
S. 编号 | 哈希图 | 哈希表 |
---|---|---|
1. | 没有方法被同步。 | 每个方法都是同步的。 |
2. | 多个线程可以同时操作,因此 hashmap 的对象不是线程安全的。 | 同一时刻只允许一个线程操作 Hashtable 的对象。因此它是线程安全的。 |
3. | 线程不需要等待,因此性能相对较高。 | 它增加了线程的等待时间,因此性能较低。 |
4. | 键和值都允许为 Null。 | 键和值都不允许为 Null。否则,我们将得到一个 NullPointerException 。 |
5. | 它是在1.2版本中引入的。 | 它是在1.0版本中引入的。 |
6. | 它是非遗产。 | 这是一个遗产。 |
现在你一定想知道为什么 HashTable 不允许 null 而 HashMap 允许?
答案很简单。为了成功地在 HashTable 中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。由于 null 不是对象,因此它无法实现这些方法。 HashMap是Hashtable的高级版本和改进。 HashMap是后来创建的。
例子:
Java
// Java program to demonstrate
// HashMap and HashTable
import java.util.*;
import java.lang.*;
import java.io.*;
// Name of the class has to be "Main"
// only if the class is public
class Ideone
{
public static void main(String args[])
{
//----------hashtable -------------------------
Hashtable<Integer,String> ht=new Hashtable<Integer,String>();
ht.put(101," ajay");
ht.put(101,"Vijay");
ht.put(102,"Ravi");
ht.put(103,"Rahul");
System.out.println("-------------Hash table--------------");
for (Map.Entry m:ht.entrySet()) {
System.out.println(m.getKey()+" "+m.getValue());
}
//----------------hashmap--------------------------------
HashMap<Integer,String> hm=new HashMap<Integer,String>();
hm.put(100,"Amit");
hm.put(104,"Amit");
hm.put(101,"Vijay");
hm.put(102,"Rahul");
System.out.println("-----------Hash map-----------");
for (Map.Entry m:hm.entrySet()) {
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
输出
-------------Hash table-------------- 103 Rahul 102 Ravi 101 Vijay -----------Hash map----------- 100 Amit 101 Vijay 102 Rahul 104 Amit
本文由 Aditya Goel 编译。
相关用法
- Java HashMap和IdentityHashMap的区别用法及代码示例
- Java HashMap clear()用法及代码示例
- Java HashMap clone()用法及代码示例
- Java HashMap isEmpty()用法及代码示例
- Java HashMap size()用法及代码示例
- Java HashMap put()用法及代码示例
- Java HashMap putAll()用法及代码示例
- Java HashMap putIfAbsent()用法及代码示例
- Java HashMap remove()用法及代码示例
- Java HashMap containsKey()用法及代码示例
- Java HashMap containsValue()用法及代码示例
- Java HashMap replace()用法及代码示例
- Java HashMap replaceAll()用法及代码示例
- Java HashMap get()用法及代码示例
- Java HashMap getOrDefault()用法及代码示例
- Java HashMap forEach()用法及代码示例
- Java HashMap entrySet()用法及代码示例
- Java HashMap keySet()用法及代码示例
- Java HashMap values()用法及代码示例
- Java HashMap merge()用法及代码示例
- Java HashMap compute()用法及代码示例
- Java HashMap computeIfAbsent()用法及代码示例
- Java HashMap computeIfPresent()用法及代码示例
- Java HashMap forEach(BiConsumer)用法及代码示例
- Java HashMap replaceAll(BiFunction)用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Differences between HashMap and HashTable in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。