当前位置:  编程技术>java/j2ee

java中Hashtable和HashMap的区别分析

    来源: 互联网  发布时间:2014-10-23

    本文导语:  1、Hashtable是Dictionary的子类, 代码如下: public class Hashtable     extends Dictionary     implements Map, Cloneable, java.io.Serializable HashMap: 代码如下:public class HashMap    extends AbstractMap     implements Map, Cloneable, Serializable HashMap和Hashtable...

1、Hashtable是Dictionary的子类,

代码如下:

 public class Hashtable
     extends Dictionary
     implements Map, Cloneable, java.io.Serializable

HashMap:
代码如下:

public class HashMap
    extends AbstractMap
     implements Map, Cloneable, Serializable

HashMap和Hashtable都是Map接口的一个实现类;

2、Hashtable中的方法是同步的(),而HashMap中的方法在默认情况下不是同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:

代码如下:

public static Map synchronizedMap(Map m)

这个方法返回一个同步的Map,也就是说返回的Map是线程安全的。需要注意的是,对返回的map进行迭代时,必须手动在返回的map上进行同步,否则将会导致不确定的行为:
代码如下:

Map m = Collections.synchronizedMap(new HashMap());
       ...
   Set s = m.keySet();  // Needn't be in synchronized block
       ...
   synchronized(m) {  // Synchronizing on m, not s!
       Iterator i = s.iterator(); // Must be in synchronized block
       while (i.hasNext())
           foo(i.next());
   }

3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。Hashtable的键值不能为null,否则:java.lang.NullPointerException 。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

代码如下:

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

而HashMap重新计算hash值,而且用与代替求模,比如HashMap的put方法:

代码如下:

public V put(K key, V value) {
         if (key == null)
             return putForNullKey(value);
         int hash = hash(key.hashCode());
         int i = indexFor(hash, table.length);
         for (Entry 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++;
         addEntry(hash, key, value, i);
         return null;
     }

代码如下:

static int hash(int h) {
         // This function ensures that hashCodes that differ only by
         // constant multiples at each bit position have a bounded
         // number of collisions (approximately 8 at default load factor).
         h ^= (h >>> 20) ^ (h >>> 12);
         return h ^ (h >>> 7) ^ (h >>> 4);
     }

代码如下:

   static int indexFor(int h, int length) {
         return h & (length-1);
     }

    
 
 

您可能感兴趣的文章:

  • java命名空间java.util类hashtable<k,v>的类成员方法: hashtable定义及介绍
  • 请教:请问java中存放数据库中的记录,用什么数据结构?(hashtable?vector?还是别的?)
  • java命名空间java.util类hashtable<k,v>的类成员方法: clear定义及介绍
  • JAVA里哪一个数据结构库(hashtable,vector等)支持一对多的关系?
  • java命名空间java.util类hashtable<k,v>的类成员方法: rehash定义及介绍
  • 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别
  • java命名空间java.util类hashtable<k,v>的类成员方法: tostring定义及介绍
  • 浅析Java中Map与HashMap,Hashtable,HashSet的区别
  • java命名空间java.util类hashtable<k,v>的类成员方法: clone定义及介绍
  • java中vector与hashtable操作实例分享
  • java命名空间java.util类hashtable<k,v>的类成员方法: keys定义及介绍
  • java hashtable实现代码
  • java命名空间java.util类hashtable<k,v>的类成员方法: isempty定义及介绍
  • Java中HashMap和Hashtable及HashSet的区别
  • java命名空间java.util类hashtable<k,v>的类成员方法: elements定义及介绍
  • 全面解析java中的hashtable
  • java命名空间java.util类hashtable<k,v>的类成员方法: containsvalue定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: hashcode定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: putall定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: containskey定义及介绍
  • java命名空间java.util类hashtable<k,v>的类成员方法: contains定义及介绍
  • java命名空间java.util类hashmap<k,v>的类成员方法: hashmap定义及介绍
  • java HashMap的keyset实例
  • java命名空间java.util类hashmap<k,v>的类成员方法: clone定义及介绍
  • java HashMap通过value反查key的代码示例
  • java命名空间java.util类hashmap<k,v>的类成员方法: clear定义及介绍
  • Java中对HashMap的深度分析
  • java命名空间java.util类hashmap<k,v>的类成员方法: isempty定义及介绍
  • 基于Java HashMap的死循环的启示详解
  • java命名空间java.util类hashmap<k,v>的类成员方法: containskey定义及介绍
  • java无锁hashmap原理与实现详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我想编程分析任意一个java文件,把其中的注释部分删掉,请帮我分析一下思路和方法好吗?
  • 急!请问有分析java程序性能瓶颈的工具吗?例如,统计 java 程序中函数调用次数?
  • Java 代码分析工具 JHawk
  • Java程序性能分析工具 VisualVM
  • Java 静态分析工具 JArchitect
  • Java监控和分析 Memory Analyzer
  • 基于Java的磁盘分析工具 JDiskReport
  • Java运行分析工具 jSonde
  • Java包依赖分析插件 ModelGoon
  • Java 网络数据分析包 JNetStream
  • Java多线程实时分析工具 mtrat
  • Java代码覆盖测试分析工具 Clover
  • Java内存使用分析 HeapAnalyzer
  • UIMA分析引擎 UIMA Java
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • 使用java如何分析系统不能识别的字符串?
  • Java动态跟踪分析工具 BTrace
  • Java代码Bug分析插件 FindBugs
  • Java文档分析工具 DoctorJ
  • Java包依赖分析 jDependency
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3