我不理解这段代码Map<E, Integer> d = new HashTable<E, Integer>(list.size());
:我们创建了一个新对象,但它是地图还是哈希表?他们两个有什么区别?我认为地图只是将2个元素放在一起的方式,就像一个键及其值(例如{3; Detroit})
答案 0 :(得分:2)
Map
是一个界面。 Hashtable
是实现Map
接口的类之一。
请参阅Map
界面的Java Doc。特别是说明所有已知实现类的部分。
任何实现Map的类都提供key->value
数据结构。作为接口的Map
定义了所有实现类必须遵守的契约。就其本身而言,Map
无法实例化。
请注意,虽然Hashtable
理想情况下应该遵循java命名约定命名为HashTable
,但这是Java中的一个史前类,甚至在标准java命名约定出现之前就存在了。因此,在您的问题中,它仍被称为Hashtable
,而不是HashTable
。
答案 1 :(得分:2)
是地图还是哈希表?
是
引用的静态编译时类型为Map
。正如其他人已经指出的那样,它是一个界面。您可以调用Map
界面上的所有方法,并知道他们将遵守合同并按照描述行事。
对象引用的动态运行时类型是Hashtable
。它以自己的方式实现Map
接口中的所有方法。
关键思想是引用的编译时类型与它指向的堆上的对象的运行时类型是分开的。
Hashtable
是JDK 1.0类,因兼容性原因而坚持使用。它已被改进以实现稍后介绍的Map
接口。建议您选择其他实施,例如HashMap
,具体取决于您的要求。
Hashtable
的最后一部分包含不应使用它的原因:
从Java 2平台v1.2开始,该类被改进以实现
Map
接口,使其成为Java Collections Framework的成员。与新的集合实现不同,Hashtable
是同步的。如果不需要线程安全实现,建议使用HashMap
代替Hashtable
。如果需要线程安全的高度并发实现,则建议使用ConcurrentHashMap
代替Hashtable
。
这意味着单线程模型的效率低于HashMap
,多线程模型的效率低于ConcurrentHashMap
。
了解编译和运行时类型的不同对于理解面向对象的多态如何工作至关重要。对于所有OO语言都是如此:C ++,Java,.NET,Python等。
答案 2 :(得分:1)
Map
是一个界面。 HashTable
是该界面的一个实现。还有其他几个,例如HashMap
,SortedMap
等。接口定义了编程API;该实现定义了如何实现该API的。不同的实现可能具有不同的运行时性能特征。
关于接口与实现,您可能会发现my answer到Java - HashMap vs Map objects这里很有帮助。