hashtable和hashmap小结

来源:互联网 发布:狂人日记读后感知乎 编辑:程序博客网 时间:2024/05/29 23:22

Hashmap和hashtable

一、 HashMap简介

1、       hashmap的特点:

1 HashMap基于哈希表实现,内部通过单链表解决冲突。

   2 HashMap是非线程安全的,只适用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap

        3 HashMap 实现了Serializable接口,支持序列化。

4、实现了Cloneable接口,能被克隆。

5 HashMapkeyvalue都允许为null

 2、HashMap的原理:

1、HashMap内部有一个存储数据的数组,每一个数组单元中存放的是一个是一个单向链表。

2、当存入一个key/value数据时,先通过哈希算法计算出哈希值,然后根据定义的算法计算出存放的位置,然后将数据放入制定的位置。(算法:哈希值与0x7FFFFFFF进行与运算,然后对数组的长度进行取余)

3、  尽管进行了复杂的位置计算,但是还是有可能发生位置冲突问题,HashMap采用链地址法解决冲突,每一个数组单元中保存了一个链表,如果计算的位置冲突,则增加链表的长度,问题迎刃而解。

4、   keynull的键值对链表的头部

3、    扩容机制

          在这里不做详解

二、Hashtable简介

    1、Hashtable的特点:

 1、基于哈希表实现的

         2、是线程安全的,能用于多线程环境中。

         3Hashtable同样实现了Serializable接口,支持序列化,

 4、实现了Cloneable接口,能被克隆。

     2、原理  

              和hashmap的原理相同

三、HashTable和HashMap区别

      1、继承的父类不同: Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

       2、线程安全性不同Hashtable中的方法是Synchronize的,线程安全,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,但使用HashMap时就必须要自己增加同步处理。Hashtable是线程安全,因为它每个方法中都加入了SynchronizeHashMap底层是散列表,当发生hash冲突的时候,hashmap是采用链地址法的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。

 就是说如果两个线程添加数值,恰巧计算的位置在同一处,这样当添加数据时,后一个就会把前一个数据覆盖掉,造成错误。不只是添加,删除也会发生错误。

      3、是否提供contains方法

     HashMapHashtablecontains方法去掉了,改成containsValuecontainsKey,因为contains方法容易让人引起误解。  Hashtable则保留了containscontainsValuecontainsKey三个方法,其中containscontainsValue功能相同。

      4、key和value是否允许null值

     通过源码的ContainsKey方法和ContainsValue的源码:  Hashtable中,keyvalue都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为keyvalue都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

      5、两个遍历方式的内部实现上不同

     HashtableHashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration枚举)的方式

      6、hash值不同

     哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。hashCode是根据对象的地址或者字符串或者数字算出来的int类型的数值。 Hashtable计算hash值,直接用keyhashCode(),而HashMap重新计算了keyhash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。

      7、内部实现使用的数组初始化和扩容方式不同

      HashTable在不指定容量的情况下的默认容量为11,而HashMap16Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。  Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

  

 

原创粉丝点击