`
hellsing42
  • 浏览: 261645 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hashTable与HashMap区别

阅读更多

HashTable的应用非常广泛, HashMap 是新框架中用来代替 HashTable 的类,也就是说建议使用 HashMap ,不要使用 HashTable 。可能你觉得 HashTable 很好用,为什么不用呢?这里简单分析他们的区别。 

  1.HashTable的方法是同步的, HashMap 未经同步, 所以在多线程场合要手动同步HashMap 这个区别就像 Vector ArrayList 一样。

 2.HashTable不允许 null (key value 都不可以 ),HashMap 允许 null (key value 都可以 )

 3.HashTable有一个 contains(Object value) ,功能和 containsValue(Object value) 功能一样。

 4. HashTable使用 Enumeration HashMap 使用 Iterator  以上只是表面的不同,它们的实现也有很大的不同。

 5.HashTable hash 数组默认大小是 11 ,增加的方式是  old*2+1 HashMap hash 数组的默认大小是 16 ,而且一定是 2 的指数。

 6.哈希值的使用不同, 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);
 }
 以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMap null 的操作。

Hashtable HashMap 的区别:
1.Hashtable Dictionary 的子类, HashMap Map 接口的一个实现类;
 2.Hashtable中的方法是同步的,而 HashMap 中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用 Hashtable 了;而对于 HashMap ,则需要额外的同步机制。但 HashMap 的同步问题可通过 Collections 的一个静态方法得到解决:
 Map Collections.synchronizedMap(Map m)
 这个方法返回一个同步的Map ,这个 Map 封装了底层的 HashMap 的所有方法,使得底层的 HashMap 即使是在多线程的环境中也是安全的。
 3. HashMap 中, null 可以作为键,这样的键只有一个 可以有一个或多个键所对应的值为null 。当get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键,而应该用 containsKey() 方法来判断。

Hashtable继承自 Dictionary 类,而 HashMap Java1.2 引进的 Map interface 的一个实现
  
 HashMap允许将 null 作为一个 entry key 或者 value ,而 Hashtable 不允许
  
 还有就是,HashMap Hashtable contains 方法去掉了,改成 containsvalue containsKey 。因为 contains 方法容易让人引起误解。

最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在
 多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而 HashMap
 就必须为之提供外同步。
  
 Hashtable HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。

分享到:
评论

相关推荐

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    HashMap和HashTable的区别和不同

    ### HashMap与HashTable的区别详解 #### 引言 在Java编程中,`HashMap`与`HashTable`作为两种常用的数据结构,经常被用来存储键值对数据。尽管它们在功能上相似,但在实现细节、性能表现以及使用场景方面存在显著...

    Hashtable和HashMap区别

    ### Hashtable与HashMap的区别 在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都属于`Map`接口的实现类,用于存储键值对数据。尽管两者在功能上相似,但在实际应用中却存在显著差异。 #...

    hashtable和hashmap的区别

    ### Hashtable和HashMap的区别 在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都实现了`Map`接口,用于存储键值对。尽管它们有着相似的功能,但在实现细节和应用场景上存在显著差异。接...

    Hashtable和HashMap的区别:

    ### Hashtable与HashMap的区别详解 #### 一、基本概念与历史背景 在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **...

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    HashMap与HashTable的主要区别在于线程安全性和对null值的支持。HashMap是非同步的,意味着在多线程环境中,如果不进行适当的同步控制,可能会导致数据不一致。而HashTable是同步的,因此它在多线程环境下的安全性更...

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...

    hashmap与hashtable区别

    ### HashMap与Hashtable的区别 在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 ##...

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    hashMap和hashTable的区别

    ### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...

    HashMap与HashTable区别

    ### HashMap与HashTable的区别 在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在...

    HashTable和HashMap的区别_动力节点Java学院整理

    什么是HashSet? HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以...

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    HashMap与HashTable的区别(含源码分析)

    在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...

    Java中HashTable和HashMap的区别_动力节点Java学院整理

    `HashTable`直接使用对象的`hashCode`,而`HashMap`则可能重新计算哈希值并使用位与操作(`&`)代替求模运算(`%`)来确定元素在数组中的位置,这有助于减少哈希冲突并提高性能。 在使用时,需要注意一些关键术语: 1. ...

    比较Vector、ArrayList和hashtable hashmap

    - HashMap 和 Hashtable 都实现了 Map 接口,HashMap 更快但不是线程安全的,而 Hashtable 是线程安全但较慢。WeakHashMap 则使用弱引用作为键,有助于防止内存泄漏。 - 在选择使用哪种数据结构时,需要考虑性能需求...

    第9讲 对比Hashtable、HashMap、TreeMap有什么不同?1

    Hashtable与HashMap类似,也是基于哈希表的,但它在Java早期版本中就已经存在,并且是线程安全的。由于同步机制的存在,Hashtable的性能相比HashMap较低,现在在多线程需求下,通常更推荐使用ConcurrentHashMap,它...

    HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的面试题。 HashMap的底层原理 HashMap是Java中...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    与HashMap相比,HashTable的同步特性使得它在多线程环境下更安全,但在单线程环境下,由于同步开销,其性能较低。 5. LinkedList与ArrayList的比较 LinkedList是List接口的另一个实现,它基于双向链表实现,对于在...

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码...本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的存储结构、构造方法、get和put方法的源码分析、Hash表的特点和缺点、HashTable和HashMap的区别等内容。

Global site tag (gtag.js) - Google Analytics