我知道Hashtable和HashMap之间的区别。然而,这两个类似乎都使用哈希函数来完成工作。Hashtable中使用的哈希函数和HashMap中使用的哈希函数有什么区别吗?
特别地,它们使用的哈希算法是否有区别?这两个类中用于哈希的公式是什么?
换句话说,计算索引(哈希值)的方式是否不同?
hash = key.hashCode();
index = (hash & 0x7FFFFFFF) % tab.length;
对于 Java 8 中的 HashMap
,代码(有效地)如下:
// (I have restructured the code for ease of comparison.)
int h;
hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
index = (tab.length - 1) & hash;
正如您所看到的,HashMap会重新排列由键的hashCode函数返回的hashCode值。源代码中解释如下:java.util.Hashtable<K,V>
类似于java.util.Vector<T>
。这是在开发早期添加到SDK中的一个类,已经被HashMap<K,V>
取代(就像ArrayList<T>
取代了Vector<T>
一样)。
因此,除非您需要所有操作的隐式同步(这默认情况下使用Hashtable
),否则您根本不应该使用它,但您仍然可以使用Collections.synchronizedMap
来实现目的,或者使用ConcurrentHashMap<K,V>
。
如Javadoc所述:
从Java 2平台v1.2开始,这个类被改装为实现
Map
接口,成为Java Collections Framework的成员。与新的集合实现不同,Hashtable
是同步的。如果不需要线程安全的实现,则建议使用HashMap
代替Hashtable
。如果需要线程安全的高并发实现,则建议使用ConcurrentHashMap
代替Hashtable
。
这两个类的哈希应该是相同的,因为它们都将使用int Object::hashCode
来实现它们的目的。
hashCode()
。因此,用于确定该“哈希”的算法取决于您如何在添加的对象上实现hashCode()
(或者一般情况下它是如何实现的)。 - dognose