1、 继承和实现区别
Hashtable是基于陈旧的Dictionary类,完成了Map接口;HashMap是Java
1.2引进的Map接口的一个实现(HashMap继承于AbstractMap,AbstractMap完成了Map接口)。
2、 线程安全不同
HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。
3、 对null的处理不同
HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。即
HashTable不允许null值其实在编译期不会有任何的不一样,会照样执行,只是在运行期的时候Hashtable中设置的话回出现空指针异常。
HashMap允许null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示
HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
4、 方法不同
HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
5、HashTable使用Enumeration,HashMap使用Iterator。
6、HashTable中hash数组默认大小是11,增加的方式是
old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
7、哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
区别
|
Hashtable
|
Hashmap
|
继承、实现
|
Hashtable extends Dictionary implements Map,
Cloneable,Serializable
|
HashMap extends AbstractMap implements Map,
Cloneable,Serializable
|
线程同步
|
已经同步过的可以安全使用
|
未同步的,可以使用Colletcions进行同步Map Collections.synchronizedMap(Map
m)
|
对null的处理
|
Hashtable table = new Hashtable();
table.put(null, "Null");
table.put("Null", null);
table.contains(null);
table.containsKey(null);
table.containsValue(null);
后面的5句话在编译的时候不会有异常,可在运行的时候会报空指针异常具体原因可以查看源代码
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new
NullPointerException();
}
|
HashMap map = new HashMap(); map.put(null, "Null");
map.put("Null", null);
map.containsKey(null);
map.containsValue(null);
以上这5条语句无论在编译期,还是在运行期都是没有错误的.
在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示
HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
|
增长率
|
protected void rehash() {
int oldCapacity = table.length;
Entry[] oldMap = table;
int newCapacity = oldCapacity * 2 +
1;
Entry[] newMap = new
Entry[newCapacity];
modCount++;
threshold = (int)(newCapacity *
loadFactor);
table = newMap;
for (int i = oldCapacity ; i-- > 0 ;)
{
for (Entry old =
oldMap[i] ; old != null ; ) {
Entry e =
old;
old =
old.next;
int index =
(e.hash & 0x7FFFFFFF) % newCapacity;
e.next =
newMap[index];
newMap[index] =
e;
}
}
}
|
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry e =
table[bucketIndex];
table[bucketIndex] = new
Entry(hash, key, value, e);
if (size++ >= threshold)
resize(2 *
table.length);
}
|
哈希值的使用
|
HashTable直接使用对象的hashCode,代码是这样的:
public synchronized
boolean containsKey(Object key) {
Entry tab[] = table;
int hash =
key.hashCode();
int index = (hash &
0x7FFFFFFF) % tab.length;
for (Entry e =
tab[index] ; e != null ; e = e.next) {
if
((e.hash == hash) && e.key.equals(key)) {
return
true;
}
}
return
false;
}
|
HashMap重新计算hash值,而且用与代替求模
public boolean containsKey(Object key)
{
Object
k = maskNull(key);
int
hash = hash(k.hashCode());
int i
= indexFor(hash, table.length);
Entry
e = table[i];
while
(e != null) {
if
(e.hash == hash && eq(k, e.key))
return
true;
e
= e.next;
}
return
false;
}
|
分享到:
相关推荐
### HashMap与HashTable的区别详解 #### 引言 在Java编程中,`HashMap`与`HashTable`作为两种常用的数据结构,经常被用来存储键值对数据。尽管它们在功能上相似,但在实现细节、性能表现以及使用场景方面存在显著...
### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在显著差异。下面将详细介绍`HashMap`...
### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...
HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的面试题。 HashMap的底层原理 HashMap是Java中...
### HashMap与Hashtable的区别 在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 ##...
HashMap和Hashtable的区别Java开发Java经验技巧共2页.pdf.zip
在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...
Java面试题11.HashMap和HashTable的区别.mp4
hashMap和Hashtable的区别1
java面试题精讲视频MP4Java面试题11.HashMap和HashTable的区别提取方式是百度网盘分享地址
HashMap 和 Hashtable 是 Java 集合框架中两个重要的映射数据结构,它们都实现了 Map 接口,但具有显著的差异。以下将详细介绍这两个类的主要区别: 1. 线程安全性: - HashMap 不是线程安全的,这意味着在多线程...
HashMap与HashTable的主要区别在于线程安全性和对null值的支持。HashMap是非同步的,意味着在多线程环境中,如果不进行适当的同步控制,可能会导致数据不一致。而HashTable是同步的,因此它在多线程环境下的安全性更...
HashMap和HashTable的区别?但是如果想线程安全有想效率高?
Java中的HashMap和HashTable是两种常见的基于哈希表的数据结构,它们在使用场景、线程安全性、数据处理方式以及API设计等方面存在显著差异。下面将详细分析这些区别。 首先,从继承关系来看,HashMap和HashTable的...
在Java编程语言中,`HashMap`和`HashTable`是两种常用的集合类,它们都是用于存储键值对的数据结构。这两个类都实现了`Map`接口,但它们之间存在一些显著的区别,这些差异主要体现在线程安全性、null值处理、迭代...
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
在Java编程语言中,`HashMap`和`HashTable`都是实现`Map`接口的数据结构,用于存储键值对。它们在很多方面有所不同,这些差异主要体现在线程安全性、迭代器类型、null值支持以及哈希码处理等方面。以下是关于两者...
HashMap 和 Hashtable 是 Java 集合框架中两个重要的 Map 实现,它们虽然都是用来存储键值对的数据结构,但在很多方面存在显著的区别。以下将详细分析它们的主要差异、工作原理和适用场景。 1. **线程安全性** - `...