Hashtable 与HashMap的区别

简介:

1、不同点:

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

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

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

可看两个类的定义:

1
2
3
4
5
  @since  JDK1. 0
  */
public  class  Hashtable<K,V>
     extends  Dictionary<K,V>
     implements  Map<K,V>, Cloneable, java.io.Serializable {
1
2
3
4
5
6
7
  @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方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   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方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     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方法。


本文转自 兴趣e族 51CTO博客,原文链接:http://blog.51cto.com/simplelife/1860192

相关文章
|
22天前
|
安全
HashTable与HashMap的区别
(1)HashTable的每个方法都用synchronized修饰,因此是线程安全的,但同时读写效率很低 (2)HashTable的Key不允许为null (3)HashTable只对key进行一次hash,HashMap进行了两次Hash (4)HashTable底层使用的数组加链表HashTable与HashMap的区别
23 2
|
2月前
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
32 1
|
2月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
41 1
|
4月前
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
|
4月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
4月前
|
安全 Java
【Java集合类面试十五】、说一说HashMap和HashTable的区别
HashMap和Hashtable的主要区别在于Hashtable是线程安全的,不允许null键和值,而HashMap是非线程安全的,允许null键和值。
|
4月前
|
安全 Java
【Java集合类面试十六】、HashMap与ConcurrentHashMap有什么区别?
HashMap是非线程安全的,而ConcurrentHashMap通过减少锁粒度来提高并发性能,检索操作无需锁,从而提供更好的线程安全性和性能。
|
4月前
|
存储 安全 Java
Hashtable 和 HashMap 的区别
【8月更文挑战第22天】
165 0
|
2月前
|
Java
让星星⭐月亮告诉你,HashMap中保证红黑树根节点一定是对应链表头节点moveRootToFront()方法源码解读
当红黑树的根节点不是其对应链表的头节点时,通过调整指针的方式将其移动至链表头部。具体步骤包括:从链表中移除根节点,更新根节点及其前后节点的指针,确保根节点成为新的头节点,并保持链表结构的完整性。此过程在Java的`HashMap$TreeNode.moveRootToFront()`方法中实现,确保了高效的数据访问与管理。
30 2