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>
    implements Map<K,V>, Cloneable, java.io.Serializable {
 * @since   1.2
 */

public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
{

2、Hashtable的put方法中key和value都不允许为null,而HashMap的put方法中key和value允许为null。

3、Hashtable是线程安全的,效率低,HashMap是线程不安全的,效率高。

以上两点可通过如下Hashtable和HashMap的put方法的源码得知:

Hashtable的put方法:

  public synchronized V put(K key, V value) { //1、方法是同步的
        // Make sure the value is not null
        if (value == null) { //2、value不能为null
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry tab[] = table;
        int hash = hash(key);//3、看如下hash(key);
        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;
            }
        }
---------------------------------------------------------------------
    private int hash(Object k) {
        // hashSeed will be zero if alternative hashing is disabled.
        return hashSeed ^ k.hashCode();//key也是不能为null的,不然会抛空指针异常。
    }

HashMap的put方法:

    public V put(K key, V value) { //1、方法是不同步的
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);//2、key可以为null
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        
        modCount++;
        //3、方法并没有对value进行任何调用,所以value可以为null
        addEntry(hash, key, value, i);
        return null;

4、Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了。当然,2个类都有containsKey和containsValue方法。

==========================================================================================

总结:

1、不同点:

    (1)、Hashtable书写不规范,t是小写(当然这不是重点),

    (2)、Hashtable继承自Dictionary,而HashMap继承自AbstractMap。

    (3)、Hashtable是JDK1.0时就有的,而HashMap是在JKD1.2时才出现的。

2、Hashtable的put方法中key和value都不允许为null,而HashMap的put方法中key和value允许为null。

3、Hashtable是线程安全的,效率低,HashMap是线程不安全的,效率高。

4、Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了。当然,2个类都有containsKey和containsValue方法。

时间: 2024-12-18 00:31:36

Hashtable 与HashMap的区别的相关文章

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

ConcurrentHashMap、HashTable、HashMap的区别

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

Java中HashTable和HashMap的区别

在Java中,HashTable和HashMap都是哈希表,那么它们有什么区别呢? 1.它们所继承的类不一样. HashTable和HashMap都实现了Map接口,但是它们所继承的类时不同的.HashTable继承了Dictionary类(Dictionary类已经过时),而HashMap则是继承了AbstractMap类.我们来看看它们的函数声明. HashTable声明: 1 public class Hashtable<K,V>extends Dictionary<K,V>

HashTable和HashMap的区别详解

原文 一.HashMap简介      HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆. HashMap存数据的过程是: HashMap内部维护了一个存

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

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

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

Hashtable和HashMap 的区别

Hashtable和HashMap 第一点不同 主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. 第二点不同 (也许是最重要的不同) Hashtable是同步的,HashMsp是异步的(可通过Collections.synchronizedMap()创建一个线程安全的map). 第三点不同 HashMap的key值可以为null, Hashtable不可以.

HashTable与HashMap的区别

名词解释 线程同步:线程同步,可理解为线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B依言执行,再将结果给A:A再继续操作.在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性. 区别 HashMap        非线程安全         允许有null的键和值            效率稍高     方法不是Synchronize的,要提供外同步 有containsva

HashTable和HashMap的区别

? ? 总结 ? ? 这两个东西一个很重要的区别是Hashtable是线程安全的,而HashMap是线程不安全的. ? ? HashMap要实现同步则要通过额外的同步机制:一般Collections的一个静态方法得到解决:Map m = Collections.synchronizedMap(new HashMap(...)); ? ? 这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的. ? ? 另外hasht