HashMap 和 Hashtable 的 6 个区别
前言HashMap和Hashtable必须由Java开发程序员掌握,也必须在各种Java面试的场合进行询问。
但是,你对这两者的区别了解多少?
现在,栈长我给大家总结一下,或许有你不明朗的地方,在栈长的指点下都会拨开迷雾见晴天。
1、线程安全
Hashtable是线程安全的,HashMap不是线程安全的。
为什么HashTable是线程安全的?
看看Hashtable的源代码。 Hashtable的所有元素操作都用同步限定,但HashMap中没有。
publicsynchronizedvput (密钥,Vvalue; publicsynchronizedvget (对象密钥;2、性能优劣
因为Hashtable是线程安全的,所以每个方法都必须阻止其他线程。 因此,Hashtable性能较差,HashMap性能较高,使用更广泛。
为了确保线程的安全和性能,建议使用JUC包下的ConcurrentHashMap。
3、NULL
Hashtable的键或值不能为null。 此外,混列映射的键值可以为null。
那么,为什么Hashtable不允许KEY和VALUE为空,而HashMap可以呢?
Hashtable put 方法逻辑:
publicsynchronizedvput(kkey,vvalue (//makesurethevalueisnotnullif ) value==null ) { thrownewnulllpointerexception } , tab[]=选项卡; inthash=key.hashCode (; } HashMap hash 方法逻辑:
staticfinalinthash (对象密钥) {inth; 返回(key==null )? 0:(h=key.hashcode () ) () ) ) ) ); 可以看到,如果Hashtable key为null,则直接抛出空指针异常;如果value为null,则手动抛出空指针异常;HashMap逻辑对null进行了特殊处理。
4、实现方式
Hashtable继承源代码:
publicclassHashtableK,VextendsDictionaryK,VimplementsMapK,v,Cloneable,java.io.Serializable HashMap的继承源代码:
publicclassHashMapK、VextendsAbstractMapK、VimplementsMapK、v、Cloneable、Serializable两者继承的类不同,Hashtable为dictiontable
Dictionary是在JDK 1.0中添加的。 好像没有人用过这个。 堆栈长也没用过。
5、容量扩容
HashMap的初始容量为16,Hashtable的初始容量为11,两者默认为0.75。
/* * *结构anew, emptyhashtablewithadefaultinitialcapacity (11 ) *andloadfactor(0.75 ) */publicHashtable () ) ) public hashtable 0 ttwiththedefaultinitialcapacity * (16 ) andthedefaultloadfactor(0.75 )/publich//allotherfieldsdefaulted }现有容量为总容量*负载率
6、迭代器
HashMap的迭代器是故障快速,而Hashtable的枚举器不是故障快速。
因此,如果其他线程更改了HashMap的结构(例如添加、删除元素),则会抛出concurrentmodificationexception异常,但不会抛出Hashtable。
可以来看下这个区别的演示:
publicstaticvoidmain (string [ ] args ) {MapString,Stringhashtable=newHashtable; hashtable.put (t1,1 ); hashtable.put('T2 ','2' ); hashtable.put('T3 ','3'; EnumerationMap.EntryString,string iterator1=(enumeration map.entry string,string ) hashtable.entrySet ).iterator hahator while (iterator1. hasmoreelements () ) system.out.println (iterator1. nextelement ) ); }MapString,StringhashMap=newHashMap (; hashmap.put (h1,1 ); hashmap.put('H2 ','2' ); hashmap.put (H3,3 ); IteratorMap.EntryString,string iterator2=hashmap.entryset (.iterator ); hashmap.remove(iterator2.next ().getKey ) ); while(iterator2.Hasnext () ) system.out.println (iterator2. next ) ); }输出信息:
T2=2t1=1exceptioninthread ' main ' Java.util.concurrentmodificationexceptionatjava.util.hashmap $ hash iterator.ntor shmap.Java:1476 ) at Java.util.Hashmap$entryiterator.next ) hashmap $ entry iterator.next ) Hava.Hashma