首页 > 编程知识 正文

【Java】HashMap 和 HashTable 的区别到底是什么?

时间:2023-05-06 21:06:45 阅读:175109 作者:2443

第一、继承不同

第一个区别主要是历史原因。 Hashtable基于旧的Dictionary类,HashMap是Java 1.2引入的Map接口的实现。

public class HashMapK,V extends AbstractMapK,V implements Cloneable,serializable { . } publicclasshashtablek,vextendsdiction Cloneable,Serializable {.}和HashMap继承的抽象类AbstractMap实现了Map接口:

publicabstractclassabstractmapk,V implements MapK,V {.}

第二、线程安全不一样

Hashtable方法是同步的,但HashMap方法缺省情况下是异步的。 在多线程并发环境中,可以直接使用Hashtable,但要使用HashMap,必须自己添加同步过程。

//这是Hashtable的put (方法:/* * * associatethespecifiedvaluewiththespecifiedkeyinthis (@ code hashtable ).ifthekeyalrred thekeyandvaluecannotbenull.* * @ param key * thekeytoadd.* @ param value * the value toadd.* @ returntheoldvalueasssociatedwiated or { @ code null } * ifthekeydidnotexist.* @ see # elements * @ see # keys * @ see Java.lang.object # equals }elseif(value==null ) thrownewnullpointerexception (' value==null ' ); } int hash=collections.secondary hash (key ); HashtableEntryK,V[] tab=table; intindex=hash(tab.Length-1; HashtableEntryK,V first=tab[index]; for(hashtableentryk,V e=first; e!=空; e=e.next(if ) e.hash==hashkey.equals ) e.key ) ) { V oldValue=e.value; e.value=value; return oldValue; }//这是HashMap的put ()方法:/* * mapsthespecifiedkeytothespecifiedvalue.* * @ param key * the key.* @ param value * the @ returnthevalueofanypreviousmappingwiththespecifiedkeyor * { @ code null } iftherewasnosuchmapping.*/@ overrridepublicvicvelicvicvicving } int hash=collections.secondary hash (key ); HashMapEntryK,V[] tab=table; intindex=hash(tab.Length-1; for(hashmapentryk,V e=tab[index] ); e!=空; e=e.next(if ) e.hash==hashkey.equals ) e.key ) ) premodify ) e ); V oldValue=e.value; e.value=value; return oldValue; }从上面的源代码中可以看到,Hashtable的put (方法是同步的,而HashMap的put )方法不是。

第三、允不允许null值

上面的put ) )方法的源代码中可以看到,在Hashtable中,key和value都为不允许出现null值,否则抛出NullPointerException异常。

另一方面,在HashMap上,只有一个键,例如null可以作为键, 与一个或多个键对应的值为空。 get ) )方法返回空值时,可以指示HashMap没有键,也可以指示与键对应的值为空。 因此,在HashMap中,应该使用containsKey ) )方法来确定某个键是否位于HashMap中,而不是使用get () )方法来确定。

第四、遍历方式的内部实现上不同

Hashtable、HashMap都使用了迭代器。 由于历史原因,Hashtable还使用了枚举方式。

第五、哈希值的使用不同

HashTable直接使用对象的hashCode。 HashMap重新计算hash值。

第六、内部实现方式的数组的初始大小和扩容的方式不一样

HashTable的hash数组的初始大小为11,增加方式为old*2 1。 HashMap散列数组的默认大小为16,并且始终为2的指数。

【总结】:

HashMap

线程不安全

允许为空的键和值

效率稍微好一点,

方法不是提供同步外部同步

有containsvalue和containsKey的方法

HashMap是Java1.2导入的map界面的安装

HashMap是Hashtable的轻量级实现

可擦可擦

线程安全

不能使用空键和值

有点低效率,

方法是同步化的

有contains方法

Hashtable被Dictionary类继承

Hashtable比HashMap旧

【建议】:

有些资料建议在需要同步时使用Hashtable,相反使用HashMap。 但是,由于可以根据需要同步HashMap,所以HashMap的功能比Hashtable的功能多,而且不是基于旧的类,所以人们普遍认为HashMap优先于Hashtable

【参考资料】:

1、Hashtable、HashMap源代码2、Java的HashMap与HashTable3、HashMap与Hashtable的区别

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。