`
liaokang.java
  • 浏览: 155475 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

HashMap和Hashtable分析

    博客分类:
  • java
阅读更多
1.先说继承关系吧
Java代码
public class Hashtable< k,v>   extends Dictionary< k,v>     implements Map< k,v>, Cloneable, java.io.Serializable {…}           public class HashMap< k,v>     extends AbstractMap< k,v>     implements Map< k,v>, Cloneable, Serializable {…}  

可以看到hashtable也是继承了Map接口。它们的不同是Hashtable(since JDK1.0)就继承了Dictionary这个抽象类,而HashMap(since JDK1.2)继承的则是AbstractMap这个抽象类。因为在Hashtable中看到继承Map后所实现的方法是JDK1.2版本时加上去的,所以可能是在JDK 1.2开发时Sun工程师出于统一的考虑使得Hashtable也继承了Map接口。

2.我们从同步和并发性上来说说它们两个的不同。

可以通过这两个类得源码来分析,Hashtable中的主要方法都做了同步处理,而HashMap则没有。可以说Hashtable在默认情况支持 同步,而HashMap在默认情况下是不支持的。我们在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加 同步处理了。对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法;或者直接使用JDK5.0之后 提供的java.util.concurrent包里的ConcurrentHashMap类。

3.它们对于null值的处理方式了
我们依然能够从源代码中得知,Hashtable中,key和value都不允许出现null值。

public synchronized V put(K key, V value) {      
  // Make sure the value is not null      
  if (value == null) {           
 throw new NullPointerException();      
  }             
 // Makes sure the key is not already in the hashtable.     
   Entry tab[] = table;       
 int hash = key.hashCode();        
 int index = (hash & 0x7FFFFFFF) % tab.length;       
 //…     } 


在我们使用上面的方法时,如参数value为null,可以从代码中直接看出程序会抛出NullPointerException;而在key为 null时,则会在“int hash = key.hashCode();“这段计算Hash值的过程中抛出NullPointerException。而在在HashMap中,允许null作为 key存在,并且和其他key的特性一样,这样的null值key只能有一个;另外HashMap允许多个value为null。这样大家就要注意了, HashMap中就不能用get(key)方法来判断HashMap中是否存在某个key,因为value为null和不存在该key的Entry都会返 回null值,而应该用containsKey()方法来判断了。

import java.util.HashMap;    
import java.util.Map;     
import java.util.Map.Entry;         
  public class TestCase {           
    public static void main(String[] args) {      
      Map< integer,string> hashMap = new HashMap< integer,string>();           
      hashMap.put(0, null);      
      hashMap.put(1, "one");     
      hashMap.put(2, "two");            
      hashMap.put(null, "null");            
      for(Entry< integer, string> e : hashMap.entrySet()) {                
      System.out.println("Key: " + e.getKey() + " -- Value: " + e.getValue());           
}            
      System.out.println(hashMap.get(0));       
      System.out.println(hashMap.get(4));           
      System.out.println("Contains key 0 ? :" + hashMap.containsKey(0));           
      System.out.println("Contains key 4 ? :" + hashMap.containsKey(4));           
      System.out.println("Contains value null ? :" + hashMap.containsValue(null));       
 }        
}  


结果
Key: null -- Value: null    
Key: 0 -- Value: null    
Key: 1 -- Value: one     
Key: 2 -- Value: two     
null    
null    
Contains key 0 ? :true    
Contains key 4 ? :false    
Contains value null ? :true   


4.hash值的获取方式
还是通过源代码源代码,Hashtable是直接使用key对象的hash值。

public synchronized V put(K key, V value) {            // Make sure the value is not null            
if (value == null) {                
    throw new NullPointerException();            
}                  
// Makes sure the key is not already in the hashtable.            Entry tab[] = table;            
int hash = key.hashCode();//hashcode            
int index = (hash & 0x7FFFFFFF) % tab.length;            
//…     } 


而HashMap则是利用key对象的hash值重新计算一个新的hash值。

public V put(K key, V value) {             
if (key == null)                 
    return putForNullKey(value);             
int hash = hash(key.hashCode());//hashcode             
int i = indexFor(hash, table.length);             
//…     }           
static int hash(int h) {            
    h ^= (h >>> 20) ^ (h >>> 12);             
    return h ^ (h >>> 7) ^ (h >>> 4);         
}  


本文是从网上一篇比较有趣的帖子上转载而来,原文链接
http://www.java3z.com/cwbwebhome/article/article8/81437.html?id=4314
分享到:
评论

相关推荐

    HashMap和HashTable的区别和不同

    综上所述,`HashMap`和`HashTable`在多个方面存在差异。选择哪一个取决于特定的应用场景和需求: - 如果需要线程安全并且能够接受一定的性能损耗,可以选择`HashTable`。 - 如果追求更高的性能且可以自己处理线程...

    hashMap和hashTable的区别

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

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

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

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

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

    HashMap与HashTable和HashSet的区别

    本文将重点分析这三种数据结构之间的区别,特别是针对`HashTable`不支持空键值对而`HashMap`支持这一点进行深入探讨。 #### 二、HashTable `HashTable`是基于哈希表实现的一个线程安全的`Map`容器,它不允许`key`...

    HashMap与HashTable区别

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

    hashmap与hashtable区别

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

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

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

    hashmap和hashtable的区别

    hashmap和hashtable的区别

    hashMap和Hashtable的区别1

    hashMap和Hashtable的区别1

    hashmap和hashtable的区别.docx

    HashMap 和 Hashtable 是 Java 集合框架中两个重要的映射数据结构,它们都实现了 Map 接口,但具有显著的差异。以下将详细介绍这两个类的主要区别: 1. 线程安全性: - HashMap 不是线程安全的,这意味着在多线程...

    11.HashMap和HashTable的区别.avi

    11.HashMap和HashTable的区别.avi

    HashMap和Hashtable的区别Java开发Jav

    HashMap和Hashtable的区别Java开发Java经验技巧共2页.pdf.zip

    HashMap,HashTable,LinkedHashMap,TreeMap的区别

    其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和用途。本文将对这四种 Map 实现类进行比较和分析。 HashMap HashMap 是 Java 中最常用的 Map 实现类,它根据键的 ...

    Java面试题11.HashMap和HashTable的区别.mp4

    Java面试题11.HashMap和HashTable的区别.mp4

    HashMap,HashTable,ConcurrentHashMap之关联.docx

    2. 键和值的 null 值:HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。 3. 效率:HashMap 的效率比 HashTable 的要高。 HashMap 的内部结构 HashMap 的内部结构是哈希表,具有较快的查询速度和相对...

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

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

    HashMap和HashTable的区别?但是如果想线程安全有想效率高?

    HashMap和HashTable的区别?但是如果想线程安全有想效率高?

    有关hashMap跟hashTable的区别,说法正确的是?

    在Java编程语言中,`HashMap`和`HashTable`都是实现`Map`接口的数据结构,用于存储键值对。它们在很多方面有所不同,这些差异主要体现在线程安全性、迭代器类型、null值支持以及哈希码处理等方面。以下是关于两者...

    比较Vector、ArrayList和hashtable hashmap

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

Global site tag (gtag.js) - Google Analytics