Java中HashMap和Hashtable之间的区别

作者: Laura McKinney
创建日期: 2 四月 2021
更新日期: 5 可能 2024
Anonim
HashMap和HashTable的区别【java技术面试视频#11】
视频: HashMap和HashTable的区别【java技术面试视频#11】

内容


HashMap和Hashtable都用来表示一个 对象组 在中表示 对。每 一对叫做 条目 宾语。的 采集 项的数量由HashMap和Hashtable的对象引用。集合中的键必须唯一或独特。 HashMap和Hashtable之间的区别在于 哈希图 特别是实现Map接口,而 哈希表 扩展了Dictionary类(旧类),该类经过重新设计以实现Map接口。另一个重要的区别是HashMap的对象是 不同步 而Hashtable的对象是 已同步.

让我们查看下面显示的比较表,以了解HashMap和Hashtable之间的更多区别。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 相似点
  5. 结论

比较表

比较基础哈希图哈希表
实施/扩展HashMap类实现Map接口并扩展AbstractMap类。Hashtable是Dictionary Legacy类的扩展,但经过了重新设计,现在还实现了Map接口。
同步化HashMap是不同步的,因此HashMap对象不是线程安全的。Hashtable是同步的,因此Hashtable的对象是线程安全的。
键/值键只能返回一次Null,但是一个值可以多次返回Null。密钥不能返回Null,因为它用于获取将用作哈希表索引的哈希码,而值也不能返回Null。
默认初始容量HashMap的默认初始容量为16。哈希表的默认初始容量为11。
遍历HashMap被Iterator遍历。与Map类一样,Hashtable也不直接支持Iterator进行遍历,因此它使用Enumerator。


HashMap的定义

HashMap是一个实现 地图 接口并扩展 抽象图 类使用哈希表。 HashMap的对象指的是 一对,其中每个键都映射到特定值。集合中的键用于检索值时必须是唯一的。另一方面,集合中的值可以重复。 HashMap类的声明和HashMapclass的构造函数如下:

/ * K代表键,V代表值* /类HashMap / * HashMap类的构造方法* / HashMap()HashMap(Map <?扩展K,?扩展V> m)HashMap(int容量)HashMap(int容量,浮点fillRatio)

第一个构造函数是默认构造函数,该构造函数以默认容量16和默认填充比0.75初始化HashMap的空对象。第二个构造函数使用m的值初始化哈希映射。第三个构造函数创建一个哈希映射,其初始容量对应于参数“ capacity”中提供的值。第四个构造函数使用参数中提供的容量和填充率初始化哈希图。现在让我们学习如何在哈希图中填充条目。

Hashmap hm =新的Hashmap(); hm.put(“ Ajay”,275); hm.put(“ Vijay”,250); hm.put(“ Jonny”,150); hm.put(“ Jordan”,200); System.out.ln(hm); / *输出* / {Vijay = 250,Jonny = 150,Ajay = 275,Jordan = 200}

在上面的代码中,您可以看到我创建了一个空的HashMap对象 具有默认的初始容量和默认的填充率。然后,我使用了将键映射到值的put(K,V)方法在哈希映射中插入了四个条目。您可以观察到,由于插入顺序不是固定的,条目没有按照您输入的顺序进行编辑。现在,考虑一个已经有条目的情况 在哈希图中,然后尝试插入put(K1,V5),即尝试将相同的键映射为不同的值。然后put方法将旧值V1替换为新值V2并返回旧值V1,否则,如果我们从不尝试替换某个键的值,则put方法将为该键返回Null。

哈希表的定义

Hashtable是扩展 字典 类,它是旧类,并且经过重新设计以实现 地图 接口。哈希表使用哈希表作为其数据结构。 Hashtable与HashMap相似,这里的Hashtable对象也指向条目的集合,其中每个条目都是一对 。另一方面,集合中的所有键必须唯一,值可以重复。这些键特别用于获取决定索引的哈希码值,其中 配对将存储在哈希表中。在哈希表中,键和值都不能返回Null指针。让我们看看Hashtable类的声明和hashtable类的构造函数。

/ * K指定键,V指定与键关联的值* /类Hashtable / * Hashtable的构造函数* / Hashtable()Hashtable(int size)Hashtable(int size,float fillRatio)Hashtable(Map <?扩展K,?扩展V> m)

在上面的代码中,第一个构造函数是一个默认构造函数,它创建一个Hashtable类的空对象,其默认大小为11,默认填充率为0.75。第二个构造函数创建一个哈希表,其大小与参数“ size”中提供的值相对应。第三个构造函数使用参数中提供的大小和填充率创建一个哈希表。第四个构造函数使用值m初始化哈希表。现在让我们学习如何插入 在哈希表中配对。

Hashtable ht = new Hashtable(); ht.put(new hashCode(2),275); ht.put(new hashCode(12),250); ht.put(new hashCode(16),150); ht.put(new hashCode(8),200); System.out.ln(ht); / *输出* / {12 = 250,16 = 150,2y = 275,8 = 200}

在上面的代码中,我创建了一个Hashtable空对象,并使用put()方法插入了四个条目。在put方法中,我调用了hashCode(),它计算并返回哈希码值,该哈希码值将用作入口对象的索引值。如您所见,我没有提到哈希表的大小,因此默认情况下为11。在这里,插入顺序也不保留,因此,当ed条目未按顺序出现时,就将其填充。


  1. HashMap实现 地图 接口并扩展抽象类, 抽象图 而Hashtable扩展了抽象类 字典,这也是旧版课程,后来经过重新设计以实现 地图 接口。
  2. HashMap对象是 不同步 即多个线程可以同时对其进行操作,因此,该对象不是线程安全的。另一方面,哈希表的对象是 已同步 即,如果一个线程想要在Hashtable的一个对象上进行操作,则它必须获得对该对象的锁定,以便其他线程无法访问该对象,因此是线程安全的。
  3. 在HashMap键可以返回 空一次,并且值可以返回 空多次。另一方面,A密钥永远无法返回Null,因为它用于获取哈希码值,该哈希值用作存储索引的哈希值。 对和一个值都不能返回Null。
  4. HashMap类中哈希表的默认容量为 16 但是,哈希表中哈希表的默认容量为 11.
  5. 迭代器 可以遍历Hashmap条目。另一方面,哈希表不直接支持迭代器,因此通常 枚举器 用于遍历Hashtable中的条目。

相似之处:

  • HashMap和Hashtable都使用 哈希表.
  • HashMap和Hashtable都实现 地图 接口
  • 广告订单未保留 在HashMap和Hashtable中,并基于使用键获得的哈希码。
  • 在HashMap和Hashtable中,键必须为 独特 而值可以是 重复的.
  • HashMap和Hashtable都可以包含 异类对象 对于键和值。
  • HashMap和Hashtable都实现 可序列化可克隆的 接口但是 不,随机访问.
  • HashMap和Hashtable都具有默认填充率 0.75.
  • HashMap和Hashtable都最适合检索或 搜寻 操作。

结论:

HashMap的性能更高,因为其对象是不同步的,并且多个线程可以同时对其进行操作,因此它比Hashtable更快。