生活随笔
收集整理的這篇文章主要介紹了
【Java集合源码剖析】Hashtable源码剖析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載請注明出處:http://blog.csdn.net/ns_code/article/details/36191279
?
Hashtable簡介
? ? Hashtable同樣是基于哈希表實現的,同樣每個元素是一個key-value對,其內部也是通過單鏈表解決沖突問題,容量不足(超過了閥值)時,同樣會自動增長。
? ? Hashtable也是JDK1.0引入的類,是線程安全的,能用于多線程環境中。
? ? Hashtable同樣實現了Serializable接口,它支持序列化,實現了Cloneable接口,能被克隆。
HashTable源碼剖析
? ? Hashtable的源碼的很多實現都與HashMap差不多,源碼如下(加入了比較詳細的注釋):
?
[java]?view plaincopy
package?java.util;????import?java.io.*;???????public?class?Hashtable<K,V>????????extends?Dictionary<K,V>????????implements?Map<K,V>,?Cloneable,?java.io.Serializable?{???????????????????private?transient?Entry[]?table;???????????????private?transient?int?count;???????????????private?int?threshold;???????????????private?float?loadFactor;???????????????private?transient?int?modCount?=?0;???????????????private?static?final?long?serialVersionUID?=?1421746759512286392L;???????????????public?Hashtable(int?initialCapacity,?float?loadFactor)?{????????????if?(initialCapacity?<?0)????????????????throw?new?IllegalArgumentException("Illegal?Capacity:?"+???????????????????????????????????????????????????initialCapacity);????????????if?(loadFactor?<=?0?||?Float.isNaN(loadFactor))????????????????throw?new?IllegalArgumentException("Illegal?Load:?"+loadFactor);???????????????if?(initialCapacity==0)????????????????initialCapacity?=?1;????????????this.loadFactor?=?loadFactor;????????????table?=?new?Entry[initialCapacity];????????????threshold?=?(int)(initialCapacity?*?loadFactor);????????}???????????????public?Hashtable(int?initialCapacity)?{????????????this(initialCapacity,?0.75f);????????}???????????????public?Hashtable()?{????????????????????this(11,?0.75f);????????}???????????????public?Hashtable(Map<??extends?K,???extends?V>?t)?{????????????this(Math.max(2*t.size(),?11),?0.75f);????????????????????putAll(t);????????}???????????public?synchronized?int?size()?{????????????return?count;????????}???????????public?synchronized?boolean?isEmpty()?{????????????return?count?==?0;????????}???????????????public?synchronized?Enumeration<K>?keys()?{????????????return?this.<K>getEnumeration(KEYS);????????}???????????????public?synchronized?Enumeration<V>?elements()?{????????????return?this.<V>getEnumeration(VALUES);????????}???????????????public?synchronized?boolean?contains(Object?value)?{????????????????????????????if?(value?==?null)?{????????????????throw?new?NullPointerException();????????????}???????????????????????????????Entry?tab[]?=?table;????????????for?(int?i?=?tab.length?;?i--?>?0?;)?{????????????????for?(Entry<K,V>?e?=?tab[i]?;?e?!=?null?;?e?=?e.next)?{????????????????????if?(e.value.equals(value))?{????????????????????????return?true;????????????????????}????????????????}????????????}????????????return?false;????????}???????????public?boolean?containsValue(Object?value)?{????????????return?contains(value);????????}???????????????public?synchronized?boolean?containsKey(Object?key)?{????????????Entry?tab[]?=?table;????????????????????int?hash?=?key.hashCode();??????????????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;????????????????????for?(Entry<K,V>?e?=?tab[index]?;?e?!=?null?;?e?=?e.next)?{????????????????if?((e.hash?==?hash)?&&?e.key.equals(key))?{????????????????????return?true;????????????????}????????????}????????????return?false;????????}???????????????public?synchronized?V?get(Object?key)?{????????????Entry?tab[]?=?table;????????????int?hash?=?key.hashCode();????????????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;????????????????????for?(Entry<K,V>?e?=?tab[index]?;?e?!=?null?;?e?=?e.next)?{????????????????if?((e.hash?==?hash)?&&?e.key.equals(key))?{????????????????????return?e.value;????????????????}????????????}????????????return?null;????????}???????????????protected?void?rehash()?{????????????int?oldCapacity?=?table.length;????????????Entry[]?oldMap?=?table;???????????????????????int?newCapacity?=?oldCapacity?*?2?+?1;????????????Entry[]?newMap?=?new?Entry[newCapacity];???????????????modCount++;????????????threshold?=?(int)(newCapacity?*?loadFactor);????????????table?=?newMap;??????????????????????????????for?(int?i?=?oldCapacity?;?i--?>?0?;)?{????????????????for?(Entry<K,V>?old?=?oldMap[i]?;?old?!=?null?;?)?{????????????????????Entry<K,V>?e?=?old;????????????????????old?=?old.next;????????????????????????????????????int?index?=?(e.hash?&?0x7FFFFFFF)?%?newCapacity;????????????????????e.next?=?newMap[index];????????????????????newMap[index]?=?e;????????????????}????????????}????????}???????????????public?synchronized?V?put(K?key,?V?value)?{????????????????????if?(value?==?null)?{????????????????throw?new?NullPointerException();????????????}???????????????????????????????Entry?tab[]?=?table;????????????int?hash?=?key.hashCode();????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;????????????for?(Entry<K,V>?e?=?tab[index]?;?e?!=?null?;?e?=?e.next)?{????????????????if?((e.hash?==?hash)?&&?e.key.equals(key))?{????????????????????V?old?=?e.value;????????????????????e.value?=?value;????????????????????return?old;????????????????????}????????????}???????????????????????????????modCount++;????????????????????????????if?(count?>=?threshold)?{??????????????rehash();???????????????????tab?=?table;????????????????index?=?(hash?&?0x7FFFFFFF)?%?tab.length;????????????}???????????????????????Entry<K,V>?e?=?tab[index];???????????????????tab[index]?=?new?Entry<K,V>(hash,?key,?value,?e);????????????count++;????????????return?null;????????}???????????????public?synchronized?V?remove(Object?key)?{????????????Entry?tab[]?=?table;????????????int?hash?=?key.hashCode();????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;??????????????????????????????????????for?(Entry<K,V>?e?=?tab[index],?prev?=?null?;?e?!=?null?;?prev?=?e,?e?=?e.next)?{????????????????if?((e.hash?==?hash)?&&?e.key.equals(key))?{????????????????????modCount++;????????????????????if?(prev?!=?null)?{????????????????????????prev.next?=?e.next;????????????????????}?else?{????????????????????????tab[index]?=?e.next;????????????????????}????????????????????count--;????????????????????V?oldValue?=?e.value;????????????????????e.value?=?null;????????????????????return?oldValue;????????????????}????????????}????????????return?null;????????}???????????????public?synchronized?void?putAll(Map<??extends?K,???extends?V>?t)?{????????????for?(Map.Entry<??extends?K,???extends?V>?e?:?t.entrySet())????????????????put(e.getKey(),?e.getValue());????????}???????????????????public?synchronized?void?clear()?{????????????Entry?tab[]?=?table;????????????modCount++;????????????for?(int?index?=?tab.length;?--index?>=?0;?)????????????????tab[index]?=?null;????????????count?=?0;????????}???????????????public?synchronized?Object?clone()?{????????????try?{????????????????Hashtable<K,V>?t?=?(Hashtable<K,V>)?super.clone();????????????????t.table?=?new?Entry[table.length];????????????????for?(int?i?=?table.length?;?i--?>?0?;?)?{????????????????????t.table[i]?=?(table[i]?!=?null)??????????????????????(Entry<K,V>)?table[i].clone()?:?null;????????????????}????????????????t.keySet?=?null;????????????????t.entrySet?=?null;????????????????t.values?=?null;????????????????t.modCount?=?0;????????????????return?t;????????????}?catch?(CloneNotSupportedException?e)?{?????????????????throw?new?InternalError();????????????}????????}???????????public?synchronized?String?toString()?{????????????int?max?=?size()?-?1;????????????if?(max?==?-1)????????????????return?"{}";???????????????StringBuilder?sb?=?new?StringBuilder();????????????Iterator<Map.Entry<K,V>>?it?=?entrySet().iterator();???????????????sb.append('{');????????????for?(int?i?=?0;?;?i++)?{????????????????Map.Entry<K,V>?e?=?it.next();????????????????K?key?=?e.getKey();????????????????V?value?=?e.getValue();????????????????sb.append(key???==?this???"(this?Map)"?:?key.toString());????????????????sb.append('=');????????????????sb.append(value?==?this???"(this?Map)"?:?value.toString());???????????????????if?(i?==?max)????????????????????return?sb.append('}').toString();????????????????sb.append(",?");????????????}????????}???????????????????????private?<T>?Enumeration<T>?getEnumeration(int?type)?{????????if?(count?==?0)?{????????????return?(Enumeration<T>)emptyEnumerator;????????}?else?{????????????return?new?Enumerator<T>(type,?false);????????}????????}???????????????????????private?<T>?Iterator<T>?getIterator(int?type)?{????????????if?(count?==?0)?{????????????????return?(Iterator<T>)?emptyIterator;????????????}?else?{????????????????return?new?Enumerator<T>(type,?true);????????????}????????}???????????????private?transient?volatile?Set<K>?keySet?=?null;????????????private?transient?volatile?Set<Map.Entry<K,V>>?entrySet?=?null;????????????private?transient?volatile?Collection<V>?values?=?null;???????????????????public?Set<K>?keySet()?{????????????if?(keySet?==?null)????????????????keySet?=?Collections.synchronizedSet(new?KeySet(),?this);????????????return?keySet;????????}???????????????????private?class?KeySet?extends?AbstractSet<K>?{????????????public?Iterator<K>?iterator()?{????????????????return?getIterator(KEYS);????????????}????????????public?int?size()?{????????????????return?count;????????????}????????????public?boolean?contains(Object?o)?{????????????????return?containsKey(o);????????????}????????????public?boolean?remove(Object?o)?{????????????????return?Hashtable.this.remove(o)?!=?null;????????????}????????????public?void?clear()?{????????????????Hashtable.this.clear();????????????}????????}???????????????????public?Set<Map.Entry<K,V>>?entrySet()?{????????????if?(entrySet==null)????????????????entrySet?=?Collections.synchronizedSet(new?EntrySet(),?this);????????????return?entrySet;????????}???????????????????private?class?EntrySet?extends?AbstractSet<Map.Entry<K,V>>?{????????????public?Iterator<Map.Entry<K,V>>?iterator()?{????????????????return?getIterator(ENTRIES);????????????}???????????????public?boolean?add(Map.Entry<K,V>?o)?{????????????????return?super.add(o);????????????}???????????????????????????????????????public?boolean?contains(Object?o)?{????????????????if?(!(o?instanceof?Map.Entry))????????????????????return?false;????????????????Map.Entry?entry?=?(Map.Entry)o;????????????????Object?key?=?entry.getKey();????????????????Entry[]?tab?=?table;????????????????int?hash?=?key.hashCode();????????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;???????????????????for?(Entry?e?=?tab[index];?e?!=?null;?e?=?e.next)????????????????????if?(e.hash==hash?&&?e.equals(entry))????????????????????????return?true;????????????????return?false;????????????}???????????????????????????????????????public?boolean?remove(Object?o)?{????????????????if?(!(o?instanceof?Map.Entry))????????????????????return?false;????????????????Map.Entry<K,V>?entry?=?(Map.Entry<K,V>)?o;????????????????K?key?=?entry.getKey();????????????????Entry[]?tab?=?table;????????????????int?hash?=?key.hashCode();????????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;???????????????????for?(Entry<K,V>?e?=?tab[index],?prev?=?null;?e?!=?null;?????????????????????prev?=?e,?e?=?e.next)?{????????????????????if?(e.hash==hash?&&?e.equals(entry))?{????????????????????????modCount++;????????????????????????if?(prev?!=?null)????????????????????????????prev.next?=?e.next;????????????????????????else???????????????????????????tab[index]?=?e.next;???????????????????????????count--;????????????????????????e.value?=?null;????????????????????????return?true;????????????????????}????????????????}????????????????return?false;????????????}???????????????public?int?size()?{????????????????return?count;????????????}???????????????public?void?clear()?{????????????????Hashtable.this.clear();????????????}????????}???????????????????public?Collection<V>?values()?{????????if?(values==null)????????????values?=?Collections.synchronizedCollection(new?ValueCollection(),????????????????????????????????????????????????????????????this);????????????return?values;????????}???????????????????private?class?ValueCollection?extends?AbstractCollection<V>?{????????????public?Iterator<V>?iterator()?{????????????return?getIterator(VALUES);????????????}????????????public?int?size()?{????????????????return?count;????????????}????????????public?boolean?contains(Object?o)?{????????????????return?containsValue(o);????????????}????????????public?void?clear()?{????????????????Hashtable.this.clear();????????????}????????}???????????????????public?synchronized?boolean?equals(Object?o)?{????????????if?(o?==?this)????????????????return?true;???????????????if?(!(o?instanceof?Map))????????????????return?false;????????????Map<K,V>?t?=?(Map<K,V>)?o;????????????if?(t.size()?!=?size())????????????????return?false;???????????????try?{????????????????????????????????????????????????????Iterator<Map.Entry<K,V>>?i?=?entrySet().iterator();????????????????while?(i.hasNext())?{????????????????????Map.Entry<K,V>?e?=?i.next();????????????????????K?key?=?e.getKey();????????????????????V?value?=?e.getValue();????????????????????if?(value?==?null)?{????????????????????????if?(!(t.get(key)==null?&&?t.containsKey(key)))????????????????????????????return?false;????????????????????}?else?{????????????????????????if?(!value.equals(t.get(key)))????????????????????????????return?false;????????????????????}????????????????}????????????}?catch?(ClassCastException?unused)???{????????????????return?false;????????????}?catch?(NullPointerException?unused)?{????????????????return?false;????????????}???????????????return?true;????????}???????????????????????public?synchronized?int?hashCode()?{????????????int?h?=?0;????????????if?(count?==?0?||?loadFactor?<?0)????????????????return?h;?????????????loadFactor?=?-loadFactor;??????????Entry[]?tab?=?table;????????????for?(int?i?=?0;?i?<?tab.length;?i++)????????????????for?(Entry?e?=?tab[i];?e?!=?null;?e?=?e.next)????????????????????h?+=?e.key.hashCode()?^?e.value.hashCode();????????????loadFactor?=?-loadFactor;?????????????return?h;????????}???????????????????private?synchronized?void?writeObject(java.io.ObjectOutputStream?s)????????????throws?IOException????????{????????????????????s.defaultWriteObject();???????????????????????s.writeInt(table.length);????????????s.writeInt(count);????????????for?(int?index?=?table.length-1;?index?>=?0;?index--)?{????????????????Entry?entry?=?table[index];???????????????????while?(entry?!=?null)?{????????????????s.writeObject(entry.key);????????????????s.writeObject(entry.value);????????????????entry?=?entry.next;????????????????}????????????}????????}???????????????????private?void?readObject(java.io.ObjectInputStream?s)?????????????throws?IOException,?ClassNotFoundException????????{????????????????????s.defaultReadObject();???????????????????????int?origlength?=?s.readInt();????????????int?elements?=?s.readInt();???????????????????????????????????????????????int?length?=?(int)(elements?*?loadFactor)?+?(elements?/?20)?+?3;????????????if?(length?>?elements?&&?(length?&?1)?==?0)????????????????length--;????????????if?(origlength?>?0?&&?length?>?origlength)????????????????length?=?origlength;???????????????Entry[]?table?=?new?Entry[length];????????????count?=?0;???????????????????????for?(;?elements?>?0;?elements--)?{????????????????K?key?=?(K)s.readObject();????????????????V?value?=?(V)s.readObject();????????????????????????????????????reconstitutionPut(table,?key,?value);????????????}????????????this.table?=?table;????????}???????????private?void?reconstitutionPut(Entry[]?tab,?K?key,?V?value)????????????throws?StreamCorruptedException????????{????????????if?(value?==?null)?{????????????????throw?new?java.io.StreamCorruptedException();????????????}????????????????????????????int?hash?=?key.hashCode();????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;????????????for?(Entry<K,V>?e?=?tab[index]?;?e?!=?null?;?e?=?e.next)?{????????????????if?((e.hash?==?hash)?&&?e.key.equals(key))?{????????????????????throw?new?java.io.StreamCorruptedException();????????????????}????????????}????????????????????Entry<K,V>?e?=?tab[index];????????????tab[index]?=?new?Entry<K,V>(hash,?key,?value,?e);????????????count++;????????}???????????????????private?static?class?Entry<K,V>?implements?Map.Entry<K,V>?{????????????????????int?hash;????????????K?key;????????????V?value;????????????????????Entry<K,V>?next;???????????????????????protected?Entry(int?hash,?K?key,?V?value,?Entry<K,V>?next)?{????????????????this.hash?=?hash;????????????????this.key?=?key;????????????????this.value?=?value;????????????????this.next?=?next;????????????}???????????????protected?Object?clone()?{????????????????return?new?Entry<K,V>(hash,?key,?value,??????????????????????(next==null???null?:?(Entry<K,V>)?next.clone()));????????????}???????????????public?K?getKey()?{????????????????return?key;????????????}???????????????public?V?getValue()?{????????????????return?value;????????????}???????????????????????public?V?setValue(V?value)?{????????????????if?(value?==?null)????????????????????throw?new?NullPointerException();???????????????????V?oldValue?=?this.value;????????????????this.value?=?value;????????????????return?oldValue;????????????}???????????????????????????????public?boolean?equals(Object?o)?{????????????????if?(!(o?instanceof?Map.Entry))????????????????????return?false;????????????????Map.Entry?e?=?(Map.Entry)o;???????????????????return?(key==null???e.getKey()==null?:?key.equals(e.getKey()))?&&???????????????????(value==null???e.getValue()==null?:?value.equals(e.getValue()));????????????}???????????????public?int?hashCode()?{????????????????return?hash?^?(value==null???0?:?value.hashCode());????????????}???????????????public?String?toString()?{????????????????return?key.toString()+"="+value.toString();????????????}????????}???????????private?static?final?int?KEYS?=?0;????????private?static?final?int?VALUES?=?1;????????private?static?final?int?ENTRIES?=?2;???????????????private?class?Enumerator<T>?implements?Enumeration<T>,?Iterator<T>?{????????????????????Entry[]?table?=?Hashtable.this.table;????????????????????int?index?=?table.length;????????????Entry<K,V>?entry?=?null;????????????Entry<K,V>?lastReturned?=?null;????????????int?type;???????????????????????????????boolean?iterator;???????????????????????protected?int?expectedModCount?=?modCount;???????????????Enumerator(int?type,?boolean?iterator)?{????????????????this.type?=?type;????????????????this.iterator?=?iterator;????????????}???????????????????????public?boolean?hasMoreElements()?{????????????????Entry<K,V>?e?=?entry;????????????????int?i?=?index;????????????????Entry[]?t?=?table;????????????????????????????while?(e?==?null?&&?i?>?0)?{????????????????????e?=?t[--i];????????????????}????????????????entry?=?e;????????????????index?=?i;????????????????return?e?!=?null;????????????}???????????????????????????????????????????????public?T?nextElement()?{????????????????Entry<K,V>?et?=?entry;????????????????int?i?=?index;????????????????Entry[]?t?=?table;????????????????????????????while?(et?==?null?&&?i?>?0)?{????????????????????et?=?t[--i];????????????????}????????????????entry?=?et;????????????????index?=?i;????????????????if?(et?!=?null)?{????????????????????Entry<K,V>?e?=?lastReturned?=?entry;????????????????????entry?=?e.next;????????????????????return?type?==?KEYS???(T)e.key?:?(type?==?VALUES???(T)e.value?:?(T)e);????????????????}????????????????throw?new?NoSuchElementException("Hashtable?Enumerator");????????????}???????????????????????????????public?boolean?hasNext()?{????????????????return?hasMoreElements();????????????}???????????????????????????????public?T?next()?{????????????????if?(modCount?!=?expectedModCount)????????????????????throw?new?ConcurrentModificationException();????????????????return?nextElement();????????????}???????????????????????????????????????public?void?remove()?{????????????????if?(!iterator)????????????????????throw?new?UnsupportedOperationException();????????????????if?(lastReturned?==?null)????????????????????throw?new?IllegalStateException("Hashtable?Enumerator");????????????????if?(modCount?!=?expectedModCount)????????????????????throw?new?ConcurrentModificationException();???????????????????synchronized(Hashtable.this)?{????????????????????Entry[]?tab?=?Hashtable.this.table;????????????????????int?index?=?(lastReturned.hash?&?0x7FFFFFFF)?%?tab.length;???????????????????????for?(Entry<K,V>?e?=?tab[index],?prev?=?null;?e?!=?null;?????????????????????????prev?=?e,?e?=?e.next)?{????????????????????????if?(e?==?lastReturned)?{????????????????????????????modCount++;????????????????????????????expectedModCount++;????????????????????????????if?(prev?==?null)????????????????????????????????tab[index]?=?e.next;????????????????????????????else???????????????????????????????prev.next?=?e.next;????????????????????????????count--;????????????????????????????lastReturned?=?null;????????????????????????????return;????????????????????????}????????????????????}????????????????????throw?new?ConcurrentModificationException();????????????????}????????????}????????}??????????????private?static?Enumeration?emptyEnumerator?=?new?EmptyEnumerator();????????private?static?Iterator?emptyIterator?=?new?EmptyIterator();???????????????????private?static?class?EmptyEnumerator?implements?Enumeration<Object>?{???????????????EmptyEnumerator()?{????????????}???????????????????????public?boolean?hasMoreElements()?{????????????????return?false;????????????}???????????????????????public?Object?nextElement()?{????????????????throw?new?NoSuchElementException("Hashtable?Enumerator");????????????}????????}??????????????????????private?static?class?EmptyIterator?implements?Iterator<Object>?{???????????????EmptyIterator()?{????????????}???????????????public?boolean?hasNext()?{????????????????return?false;????????????}???????????????public?Object?next()?{????????????????throw?new?NoSuchElementException("Hashtable?Iterator");????????????}???????????????public?void?remove()?{????????????????throw?new?IllegalStateException("Hashtable?Iterator");????????????}???????????}????}??? 幾點總結
? ? 針對Hashtable,我們同樣給出幾點比較重要的總結,但要結合與HashMap的比較來總結。
? ? 1、二者的存儲結構和解決沖突的方法都是相同的。
? ? 2、HashTable在不指定容量的情況下的默認容量為11,而HashMap為16,Hashtable不要求底層數組的容量一定要為2的整數次冪,而HashMap則要求一定為2的整數次冪。
? ? 3、Hashtable中key和value都不允許為null,而HashMap中key和value都允許為null(key只能有一個為null,而value則可以有多個為null)。但是如果在Hashtable中有類似put(null,null)的操作,編譯同樣可以通過,因為key和value都是Object類型,但運行時會拋出NullPointerException異常,這是JDK的規范規定的。我們來看下ContainsKey方法和ContainsValue的源碼:
?
[java]?view plaincopy
?public?synchronized?boolean?contains(Object?value)?{???????????????????if?(value?==?null)?{?????????????throw?new?NullPointerException();?????????}?????????????????????Entry?tab[]?=?table;?????????for?(int?i?=?tab.length?;?i--?>?0?;)?{?????????????for?(Entry<K,V>?e?=?tab[i]?;?e?!=?null?;?e?=?e.next)?{?????????????????if?(e.value.equals(value))?{?????????????????????return?true;?????????????????}?????????????}?????????}?????????return?false;?????}???????public?boolean?containsValue(Object?value)?{?????????return?contains(value);?????}????????public?synchronized?boolean?containsKey(Object?key)?{?????????Entry?tab[]?=?table;????/計算hash值,直接用key的hashCode代替???????int?hash?=?key.hashCode();????????????????int?index?=?(hash?&?0x7FFFFFFF)?%?tab.length;??????????????for?(Entry<K,V>?e?=?tab[index]?;?e?!=?null?;?e?=?e.next)?{?????????????if?((e.hash?==?hash)?&&?e.key.equals(key))?{?????????????????return?true;?????????????}?????????}?????????return?false;?????}???? ? ? 很明顯,如果value為null,會直接拋出NullPointerException異常,但源碼中并沒有對key是否為null判斷,有點小不解!不過NullPointerException屬于RuntimeException異常,是可以由JVM自動拋出的,也許對key的值在JVM中有所限制吧。
? ? 4、Hashtable擴容時,將容量變為原來的2倍加1,而HashMap擴容時,將容量變為原來的2倍。
? ? 5、Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值,Hashtable在求hash值對應的位置索引時,用取模運算,而HashMap在求位置索引時,則用與運算,且這里一般先用hash&0x7FFFFFFF后,再對length取模,&0x7FFFFFFF的目的是為了將負的hash值轉化為正值,因為hash值有可能為負數,而&0x7FFFFFFF后,只有符號外改變,而后面的位都不變。
轉載于:https://www.cnblogs.com/NullPointException/p/5069517.html
總結
以上是生活随笔為你收集整理的【Java集合源码剖析】Hashtable源码剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。