Hashtable 和 HashMap 的比较


 

Hashtable

HashMap

并发操作

使用同步机制,

实际应用程序中,仅仅是Hashtable本身的同步并不能保证程序在并发操作下的正确性,需要高层次的并发保护。

下面的代码试图在key所对应的value值等于x的情况下修改value为x+1

{

value = hashTable.get(key);

if(value.intValue()== x){

hashTable.put(key,      new Integer(value.intValue()+1));

}

}

如2个线程同时执行以上代码,可能放入不是x+1,而是x+2.


没有同步机制,需要使用者自己进行并发访问控制

数据遍历的方式

Iterator 和 Enumeration

Iterator

是否支持fast-fail

用Iterator遍历,支持fast-fail

用Enumeration不支持fast-fail.


支持fast-fail

是否接受值为null的Key 或Value?

不接受

接受

根据hash值计算数组下标的算法

当数组长度较小,并且Key的hash值低位数值分散不均匀时,不同的hash值计算得到相同下标值的几率较高

 

hash = key.hashCode();

index=(hash&0x7FFFFFFF) % tab.length;


优于hashtable,通过对Key的hash做移位运算和位的与运算,使其能更广泛地分散到数组的不同位置

 

hash = hash (k);

index = 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);

}


Entry数组的长度

Ø         缺省初始长度为11,

Ø         初始化时可以指定initial capacity


Ø         缺省初始长度为16,

Ø         长度始终保持2的n次方

Ø         初始化时可以指定initial capacity,若不是2的次方,HashMap将选取第一个大于initial capacity 的2n次方值作为其初始长度


LoadFactor负荷因子

0.75

负荷超过(loadFactor * 数组长度)时,内部数据的调整方式

扩展数组:2*原数组长度+1

扩展数组: 原数组长度 * 2

两者都会重新根据Key的hash值计算其在数组中的新位置,重新放置。算法相似,时间、空间效率相同

一般情况下,HashMap能够比Hashtable工作的更好、更快,主要得益于它的散列算法,以及没有同步。应用程序一般在更高的层面上实 现了保护机制,而不是依赖于这些底层数据结构的同步,因此,HashMap能够在大多应用中满足需要。推荐使用HashMap,如果需要同步,可以使用同步工具类将其转换成支持同步的HashMap。

时间: 2024-10-06 14:37:09

Hashtable 和 HashMap 的比较的相关文章

HashTable vs HashMap(三)

HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable. 可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别. 1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样. 2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value

JVM里面hashtable和hashmap实现原理

JVM里面hashtable和hashmap实现原理 文章分类:Java编程 转载 在hashtable和hashmap是java里面常见的容器类, 是Java.uitl包下面的类, 那么Hashtable和Hashmap是怎么实现hash键值对配对的呢,我们看看jdk里面的源码,分析下Hashtable的构造方法,put(K, V)加入方法和get(Object)方法就大概明白了. 一.Hashtable的构造方法:Hashtable(int initialCapacity, float lo

C# Hashtable 使用说明 以及 Hashtable和HashMap的区别

一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对. 二,哈希表的简单操作 在哈希表中添加一个key/value键值对:Hashta

Hashtable 和HashMap 的区别(原型模式)

哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元.检索时采用检索关键码的方法.现在哈希表有一套完整的算法来进行插入.删除和解决冲突.在Java中哈希表用于存储对象,实现快速检索. Java.util.Hashtable提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作. 哈希表类中提供了三种构造方法,分别是: public Hasht

Hashtable 与HashMap的区别

1.不同点: (1).Hashtable书写不规范,t是小写(当然这不是重点,哈哈), (2).Hashtable继承自Dictionary,而HashMap继承自AbstractMap. (3).Hashtable是JDK1.0时就有的,而HashMap是在JKD1.2时才出现的. 可看两个类的定义:  * @since JDK1.0  */ public class Hashtable<K,V>     extends Dictionary<K,V>     implement

Hashtable和HashMap类的区别

Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. 也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是.这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步.一个方便的方法就是利用Collections类的静态的synchroni

【java】HashTable和HashMap区别

①继承不同 public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map ②Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的. 在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了. ③Hashtable中,key和value都不允许出现null值

关于HashTable,HashMap和TreeMap的几点心得

刚开始看到HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.于是自己搜索了一些相关资料来学习,以下就是我的学习沉淀. java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多只能映射一个一个值. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直

Hashtable和HashMap的区别举例

我们先看2个类的定义 [java] view plaincopy public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable [java] view plaincopy public class HashMap extends AbstractMap implements Map, Cloneable, Serializable 可见Hashtable 继承自 Dictiion

ConcurrentHashMap、HashTable、HashMap的区别

HashTable与ConcurrentHashMap: 相同点:都是线程安全的,可以在多线程的环境下运行.key和value都不能为null 区别:性能上的差异.HashTable每次操作对象都会锁住对象,性能差:而ConcurrentHashMap内部使用Segment数组,每个Segment类似于Hashtable,在操作的时候仅会锁住当前操作的某个Segment对象,其它的线程能够并发执行其它的Segment对象,性能比较好. HashTable与HashMap: 相同点:都是以键值对存