java:map和hash表之间的区别



我不理解这段代码Map<E, Integer> d = new HashTable<E, Integer>(list.size());:我们创建了一个新对象,但它是映射还是哈希表?他们俩有什么区别?我认为地图只是把两个元素放在一起的一种方式,就像一把钥匙和它的值(例如{3;底特律})

它是映射还是哈希表?

是。

引用的静态编译时类型是Map。正如其他人已经指出的那样,这是一个界面。您可以调用Map接口上的所有方法,并知道它们将遵守约定并按照描述行事。

引用的对象的动态运行时类型是Hashtable。它以自己的方式实现了Map接口中的所有方法。

关键思想是引用的编译时类型与它所指向的堆上对象的运行时类型是分开的

Hashtable是一个JDK1.0类,由于兼容性的原因,它一直保留着。对其进行了改造,以实现稍后介绍的Map接口。建议您根据自己的需求选择另一种实现,例如HashMap

Hashtable的最后一部分包含了不应该使用它的原因:

从Java 2平台v1.2开始,这个类被改造以实现Map接口,使其成为Java Collections Framework的成员。与新的集合实现不同,Hashtable是同步的。如果不需要线程安全实现,建议使用HashMap来代替Hashtable。如果需要线程安全的高并发实现,则建议使用ConcurrentHashMap来代替Hashtable

这意味着它对于单线程模型的效率低于HashMap,而对于多线程模型则低于ConcurrentHashMap

了解编译和运行时类型的差异对于理解面向对象多态性的工作方式至关重要。这适用于所有OO语言:C++、Java、。NET、Python等

Map是一个接口。Hashtable是实现Map接口的类之一。

Map接口见Java文档。特别是说明所有已知实现类的部分。

任何实现Map的类都提供key->value数据结构。作为接口的Map定义了所有实现类必须遵守的约定。就其本身而言,Map不能实例化。

请注意,虽然Hashtable在理想情况下应该按照java命名约定命名为HashTable,但这是java中的一个史前类,甚至在标准java命名约定出现之前就已经存在了。因此,它仍然被称为Hashtable,而不是你的问题中错误地提到的HashTable

Map接口HashTable是该接口的一个实现。还有其他几种,如HashMapSortedMap等。接口定义了编程API;实现定义了API的实现方式。不同的实现可能具有不同的运行时性能特征。

关于接口与实现,您可能会发现我对Java-HashMap与Map对象的回答很有帮助。

最新更新