HashMap和Hashtable
Java Collections框架提供了一组集合类。每个班级都有自己的表现优势和劣势。一些类提供了可以按原样使用的完整实现。其他是抽象的,提供骨架实现,用作创建集合的起点。集合实现使用synchronized-wrapper框架来提供同步类,否则实现是不同步的。几个类提供了map接口的实现。
Java平台包含三个通用的Map实现:HashMap,TreeMap和LinkedHashMap。 HashMap和Hashtable是Java中的两个集合,用于在散列表中存储键/值对。 Hashtable是一个同步的Map,而HashMap是一个不同步的Map。但是,如果需要使用同步Map,则Hashtable比在同步包装中使用HashMap更快。两者都是Java中基于哈希的集合,但它们有相当大的差异。我们强调两者之间的一些主要差异,以帮助您更好地理解术语。
什么是HashMap?
HashMap是一个基于哈希表的Map实现,它为插入和定位对提供了恒定时间的性能。 HashMap类提供基于Hashtable数据结构的map实现。此实现支持所有Map操作,并允许多个空值但只允许一个空键。它使用键/值对将值存储在哈希表中。它是一个不同步的Map,这意味着它不是线程安全的,如果没有正确的同步,就无法在多个线程之间共享。
什么是Hashtable?
与HashMap不同,Hashtable是一个同步Map,它是线程安全的,这意味着它可以在多个线程之间共享。在Hashtable中,指定可用作键的对象以及与键一起使用的值。 Hashtable借助哈希函数将键映射到值。 Java以Object的hashcode()方法的形式提供此函数,该类重写以提供适当的哈希代码。与HashMap不同,Hashtable不支持空值和空键,因为在Hashtable的put方法实现中存在空值检查。
HashMap和Hashtable之间的区别
两者都是Java中基于哈希的集合,用于在键/值对中存储数据。 HashMap是一个基于哈希表的Map实现,它为插入和定位对提供了恒定时间的性能。可以使用构造函数来调整性能,这些构造函数允许您设置哈希表的容量和加载因子。基本的Hashtable与HashMap非常相似,甚至在方法名称下也是如此。它将键/值对存储在哈希表中。在Hashtable中,指定可用作键的对象以及与键一起使用的值。
HashMap和Hashtable都使用散列技术来存储基于密钥的值。与HashMap一样,Hashtable使用键/值对在哈希表中存储值。但是,两者之间的关键区别在于同步。 HashMap是一个不同步的Map,而Hashtable是一个同步的Map。这意味着HashMap不是线程安全的,如果没有适当的同步代码,则无法在多个线程之间共享。相反,Hashtable是线程安全的,可以在多个线程之间共享。如果需要使用同步Map,则Hashtable比在同步包装器中使用HashMap更快。
HashMap类提供基于Hashtable数据结构的map实现。此实现支持所有Map操作,并允许多个空值但只允许一个空键,以便它可以维护唯一的键属性。但是,它不保证条目的存储顺序。另一方面,Hashtable在哈希函数的帮助下将键映射到值。与HashMap不同,Hashtable不支持空值和空键,因为在Hashtable的put方法实现中存在空值检查。
因为HashMap不是同步Map,所以它在性能方面比Hashtable更快更好,事实上,使用的内存比Hashtable少。虽然它们实际上是相同的,但Hashtable比HashMap慢一点但比同步的HashMap更快。本质上,使用具有多线程访问的Hashtable是不安全的,因为只有方法是同步的。 Hashtable是HashMap的同步对应物。与同步对象相比,非同步对象的性能更好,就像Hashtable在单线程环境中表现更好一样。
HashMap与Hashtable:比较图表
HashMap的概述。哈希表
HashMap类为您提供未排序的无序Map。因此,当您需要Map并且您不关心条目的存储顺序时,HashMap就是您的选择。
Hashtable,就像Vector一样,已经出现在史前Java时代。就像Vector是更现代和更高级的ArrayList的同步对应物一样,Hashtable是HashMap的同步对应物。但是,类无法同步,因此当我们说Hashtable是同步Map时,这意味着类的关键方法是同步的。
虽然两者几乎完全相同,但不同之处在于它们的同步方式和它们的表现方式。 HashMap在多线程环境中表现更好,而Hashtable在单线程环境中表现更好。