Hashtable作为遗留类,其实完全可以弃置不用了。从这个角度来看,似乎本文的实际意义不大。写本文,其实大有自娱自乐之意,另外给自己备忘,呵呵~
本站也有很多这类的文章了,我做的工作只不过是收集并分析这些文章,然后给出一个容易理解的综合帖罢了。
本文主要阐述了HashMap和Hahstable下面几点不同:
- 1、线程安全
- 2、key/value是否可为null
- 3、求hash码以及index的机制不同
- 4、contains/containsValue/containsKey方法
- 5、迭代器
1、线程安全
看源码,很容易发现Hashtable是线程安全的,而HashMap不是。而Hashtable实现线程安全的机制是给所有需要同步处理的方法加上synchronized关键字。
如果要让HashMap变成线程安全的,除了自己实现或者用JDK里自带的线程安全类之外,我们可以用java.util.Collections提供的synchronizedMap方法获得一个进行同步处理封装后的Map。
2、key/value是否可为null
HashMap允许在table[0]位置保存一对key为null的k-v,并且从来不对value是否为null进行验证。
而Hashtable所有的key和value都不能为空,否则报出空指针异常。
3、求hash码以及index的机制不同
Hashtable中put一个新k-v对的时候,调用这个方法:
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
其中int index = (hash & 0x7FFFFFFF) % tab.length;可以看出,不像HashMap中复杂的hash()方法,这里只是简单的通过hash & 0x7FFFFFFF将hash值变为正数,然后用求余方式求得index相对于HashMap位运算。在HashMap调用put方法判断key是否重复的方式是e.hash == hash && ((k = e.key) == key || key.equals(k)),而在HashTable中是(e.hash == hash) && e.key.equals(key)。为了方便位运算求index,HashMap中的table初始容量是16,然后每次扩容都是*2,而在Hashtable默认初始容量为15,扩容的时候int newCapacity =oldCapacity * 2 + 1;两者的默认加载因子都是0.75.
由于两者使用的算法差不多,所以一般情况下两者的性能相差不大。
4、contains/containsValue/containsKey方法
Hashtable中:
contains传入的参数是value,containsValue方法和contains同样的作用,因为它内部就是调用contains来处理的。containsKey在判断到(e.hash == hash) && e.key.equals(key)为true的时候就会返回ture。
HashMap中:
没有容易混淆意义的contains方法。containsValue方法会分value是否为null(因为HashMap对value是否为null不做要求)进行判断,两者都是遍历然后判断value.equals(e.value)(传入的value参数不为null)或者e.value == null(传入的value参数为null)是否为true,如果为true则该方法返回true。containsKey判断标准是e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))是否为true。
5、迭代器
HashTable使用Enumeration,HashMap使用Iterator 。
实际上,这是一个历史原因,在jdk1.0和jdk1.1版本中,jdk的设计者选择了Enumeration作为迭代器,在设计jdk1.2他们也许是因为Enumeration中的方法名字太长了,也许是因为Iterator 这个名字更加符合迭代器的本质,所以就改为了Iterator 。其实Iterator 比Enumeration多出的只是一个remove方法,其他完全一样。
分享到:
相关推荐
综上所述,`HashMap`和`HashTable`在多个方面存在差异。选择哪一个取决于特定的应用场景和需求: - 如果需要线程安全并且能够接受一定的性能损耗,可以选择`HashTable`。 - 如果追求更高的性能且可以自己处理线程...
### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...
HashMap和HashTable底层原理以及常见面试题 HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的...
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...
在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在显著差异。下面将详细介绍`HashMap`...
在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 #### 1. 历史背景及实现原理 - **...
hashmap和hashtable的区别
在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...
hashMap和Hashtable的区别1
HashMap 和 Hashtable 是 Java 集合框架中两个重要的映射数据结构,它们都实现了 Map 接口,但具有显著的差异。以下将详细介绍这两个类的主要区别: 1. 线程安全性: - HashMap 不是线程安全的,这意味着在多线程...
- HashMap 和 Hashtable 都实现了 Map 接口,HashMap 更快但不是线程安全的,而 Hashtable 是线程安全但较慢。WeakHashMap 则使用弱引用作为键,有助于防止内存泄漏。 - 在选择使用哪种数据结构时,需要考虑性能需求...
11.HashMap和HashTable的区别.avi
HashMap和Hashtable的区别Java开发Java经验技巧共2页.pdf.zip
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和用途。本文将对这四种 Map 实现类进行比较和分析。 HashMap HashMap 是 Java 中最常用的 Map 实现类,它根据键的 ...
2. 键和值的 null 值:HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。 3. 效率:HashMap 的效率比 HashTable 的要高。 HashMap 的内部结构 HashMap 的内部结构是哈希表,具有较快的查询速度和相对...
Java面试题11.HashMap和HashTable的区别.mp4
比较分析Vector、ArrayList和hashtable hashmap数据结构
在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **Hashtable**:作为 `Dictionary` 类的子类,`Hashtable` 是 Java 最早...