当前位置: 首页 > 科技观察

HashMap和Hashtable的6个区别,很少有人知道最后一个!

时间:2023-03-20 17:09:51 科技观察

HashMap和Hashtable是Java开发程序员必须掌握的,在各种Java面试情况下必问。但是你对两者的区别了解多少呢?现在,让我为您总结一下,堆栈的负责人。也许有些事情你不清楚。1、线程安全Hashtable是线程安全的,而HashMap不是线程安全的。为什么HashTable是线程安全的?查看Hashtable的源码,Hashtable的所有元素操作都是同步的,但是HashMap不是。publicsynchronizedVput(Kkey,Vvalue);publicsynchronizedVget(Objectkey);...2.性能优劣由于Hashtable是线程安全的,每个方法都必须阻塞其他线程,所以Hashtable性能较差,而HashMap性能更好,应用更广泛用过的。如果对线程安全和性能有要求,建议使用JUC包下的ConcurrentHashMap。3、NULLHashtable不允许key或value为null,而HashMap的key值可以为null。那么问题来了,为什么Hashtable不允许KEY和VALUE为null,而HashMap可以呢?Hashtableput方法逻辑:publicsynchronizedVput(Kkey,Vvalue){//Makesurethevalueisnotnullif(value==null){thrownewNullPointerException();}//Makesurethekeyisnotalreadyininthehashtable.Entrytab[]=table;inthash=key.hashCode();...}HashMap哈希方法逻辑:staticfinalinthash(Objectkey){inth;return(key==null)?0:(h=key.hashCode())^(h>>>16);}可以看出Hashtablekey为null则直接抛空指针异常,value为null则手动抛空指针异常,HashMap的逻辑有特殊处理。4.实现方法Hashtable继承源码:publicclassHashtableextendsDictionaryimplementsMap,Cloneable,java.io.SerializableHashMap继承源码:publicclassHashMapextendsAbstractMapimplementsMap,Cloneable,Serializable可以看出两者的继承类是不一样的。Hashtable继承了Dictionary类,而HashMap继承了AbstractMap类。词典是在JDK1.0中加入的。好像没人用过,我也没有。。5.扩容HashMap的初始容量为:16,Hashtable的初始容量为:11,两者默认的加载因子为:0.75。/***构造一个空HashMap,默认初始容量*(16)和默认负载因子(0.75)。*/publicHashMap(){this.loadFactor=DEFAULT_LOAD_FACTOR;//allotherfieldsdefaulted}当现有容量大于总容量时*负载因子,HashMap扩容规则是当前容量的2倍,Hashtable扩容规则是当前容量的2倍+1.6。IteratorHashMap中的Iterator是fail-fast的,但是Hashtable的Enumerator不是fail-fast的。因此,当其他线程改变HashMap的结构时,比如增加或删除元素时,会抛出ConcurrentModificationException,而Hashtable则不会。可以来看看下面这个区域的显示:/***微信公众号:Java技术栈**/publicstaticvoidmain(String[]args){Maphashtable=newHashtable<>();hashtable.put("t1","1");hashtable.put("t2","2");hashtable.put("t3","3");Enumeration>iterator1=(Enumeration>)hashtable.entrySet().iterator();hashtable.remove(iterator1.nextElement().getKey());while(iterator1.hasMoreElements()){System.out.println(iterator1.nextElement());}MaphashMap=newHashMap<>();hashMap.put("h1","1");hashMap.put("h2","2");hashMap.put("h3","3");Iterator>iterator2=hashMap.entrySet().iterator();hashMap.remove(iterator2.next().getKey());while(iterator2.hasNext()){System.out.println(iterator2.next());}}输出信息:t2=2t1=1Exceptioninthread"main"java.util.ConcurrentModificationException在java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)atjava.util.HashMap$EntryIterator.next(HashMap.java:1476)atjava.util.HashMap$EntryIterator.next(HashMap.java:1474)atcn。你见过javastack.Test.main(Test.java:37)吗?所以,这也是Enumeration和Iterator的区别