Java中HashMap与HashTable的区别

原文地址:Differences between HashMap and HashTable in Java

HashMap与HashTable在哈希表中存储键值对。当用HashTable或者HashMap的时候,我们指定一个对象用作key,还有一个指向这个key的value。然后对这个key进行hash操作,得到的哈希码用于在表中存放value的索引。

Java代码样例

// A sample Java program to demonstrate HashMap and HashTable
import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main(String args[])
    {
        //----------hashtable -------------------------
        Hashtable<Integer,String> ht=new Hashtable<Integer,String>();
        ht.put(101," ajay");
        ht.put(101,"Vijay");
        ht.put(102,"Ravi");
        ht.put(103,"Rahul");
        System.out.println("-------------Hash table--------------");
        for (Map.Entry m:ht.entrySet()) {
            System.out.println(m.getKey()+" "+m.getValue());
        }

        //----------------hashmap--------------------------------
        HashMap<Integer,String> hm=new HashMap<Integer,String>();
        hm.put(100,"Amit");
        hm.put(104,"Amit");  // hash map allows duplicate values
        hm.put(101,"Vijay");
        hm.put(102,"Rahul");
        System.out.println("-----------Hash map-----------");
        for (Map.Entry m:hm.entrySet()) {
            System.out.println(m.getKey()+" "+m.getValue());
        }
    }
}

输出:

-------------Hash table--------------
103 Rahul
102 Ravi
101 Vijay
-----------Hash map-----------
100 Amit
101 Vijay
102 Rahul
104 Amit

HashMap vs HashTable

  1. HashMap不是同步的。它不是线程安全的,所以在没有恰当的synchronization代码的情况下多线程之间不能共享。然而HashTable是同步的,它是线程安全的,可以被多线程共享。
  2. HashMap允许NULL key,多个NULL value。HashTable是不允许有null key和value的。
  3. HashMap一般优于HashTable,如果同步不是必须的话。

为什么HashTable不允许有null而HashMap允许有?

为了能够成功地从HashTable中存储并检索,用作key的对象必须实现hashCode方法还有equals方法。因为null不是一个对象,所以不能实现这些方法。HashMap是HashTable的一个改进版本。HashMap是后面创造出来的。

来源:

Sources:
http://docs.oracle.com/javase/6/docs/api/java/util/Hashtable.html:
http://qa.geeksforgeeks.org/558/differences-between-hashmap-hashtable-and-hashset-in-java?show=558#q558

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值