ƵµÀÀ¸Ä¿
Ê×Ò³ > ³ÌÐò¿ª·¢ > Èí¼þ¿ª·¢ > Java > ÕýÎÄ
javaÖеÄMap½Ó¿ÚʵÏÖÀàTreeMap¡¢HashMap¡¢WeakHashMap¡¢HashTableµÄʵÀý½²½â
2019-12-09 15:24:39         À´Ô´£ºµ÷ƤµÄд´úÂë  
Êղؠ  ÎÒҪͶ¸å

Ò»¡¢MapµÄ¼ò½é

¶þ¡¢HashMapÔ´Âë½â¶Á

1£©HashMapµÄÌØµã

HashMapÊÇ»ùÓÚ¹þÏ£±íʵÏֵģ¬Ã¿Ò»¸öÔªËØÊÇÒ»¸ökey-value¶Ô£¬ÆäÄÚ²¿Í¨¹ýµ¥Á´±í½â¾ö³åÍ»ÎÊÌ⣬ÈÝÁ¿²»×㣨³¬¹ýÁË·§Öµ£©Ê±£¬Í¬Ñù»á×Ô¶¯Ôö³¤£»

HashMapÊÇ·ÇḬ̈߳²È«µÄ£¬Ö»ÊÇÓÃÓÚµ¥Ï̻߳·¾³Ï£¬¶àÏ̻߳·¾³Ï¿ÉÒÔ²ÉÓÃconcurrent²¢·¢°üϵÄconcurrentHashMap£»

HashMapʵÏÖÁËSerializable½Ó¿Ú£¬Òò´ËËüÖ§³ÖÐòÁл¯£»

ʵÏÖÁËCloneable½Ó¿Ú£¬Äܱ»¿Ë¡¡£

2£©HashMapµÄÔ´Âë½²½â£¨jdk1.7£©²Î¿¼¸½ÊôÎļþµÄ´úÂ룬ԭÎÄÖÐÓÐ×¢½â£¬ÏÂÔØ

3£©HashMapµÄ×ܽá

Ê×ÏÈÒªÇå³þHashMapµÄ´æ´¢½á¹¹£¬ÈçÏÂͼËùʾ£º

\

ͼÖУ¬×ÏÉ«²¿·Ö¼´´ú±í¹þÏ£±í£¬Ò²³ÆÎª¹þÏ£Êý×飬Êý×éµÄÿ¸öÔªËØ¶¼ÊÇÒ»¸öµ¥Á´±íµÄÍ·½Úµã£¬Á´±íÊÇÓÃÀ´½â¾ö³åÍ»µÄ£¬Èç¹û²»Í¬µÄkeyÓ³Éäµ½ÁËÊý×éµÄͬһλÖô¦£¬¾Í½«Æä·ÅÈëµ¥Á´±íÖС£

Ê×ÏÈ¿´Á´±íÖнڵãµÄÊý¾Ý½á¹¹£º

// EntryÊǵ¥ÏòÁ´±í¡£  
 // ËüÊÇ “HashMapÁ´Ê½´æ´¢·¨”¶ÔÓ¦µÄÁ´±í¡£  
 // ËüʵÏÖÁËMap.Entry ½Ó¿Ú£¬¼´ÊµÏÖgetKey(), getValue(), setValue(V value), equals(Object o), hashCode()ÕâЩº¯Êý  
 static class Entry implements Map.Entry {  
  final K key;  
  V value;  
  // Ö¸ÏòÏÂÒ»¸ö½Úµã  
  Entry next;  
  final int hash;  
 
  // ¹¹Ô캯Êý¡£  
  // ÊäÈë²ÎÊý°üÀ¨"¹þÏ£Öµ(h)", "¼ü(k)", "Öµ(v)", "ÏÂÒ»½Úµã(n)"  
  Entry(int h, K k, V v, Entry n) {  
value = v;  
next = n;  
key = k;  
hash = h;  
  }  
 
  public final K getKey() {  
return key;  
  }  
 
  public final V getValue() {  
return value;  
  }  
 
  public final V setValue(V newValue) {  
V oldValue = value;  
value = newValue;  
return oldValue;  
  }  
 
  // ÅжÏÁ½¸öEntryÊÇ·ñÏàµÈ  
  // ÈôÁ½¸öEntryµÄ“key”ºÍ“value”¶¼ÏàµÈ£¬Ôò·µ»Øtrue¡£  
  // ·ñÔò£¬·µ»Øfalse  
  public final boolean equals(Object o) {  
if (!(o instanceof Map.Entry))  
 return false;  
Map.Entry e = (Map.Entry)o;  
Object k1 = getKey();  
Object k2 = e.getKey();  
if (k1 == k2 || (k1 != null && k1.equals(k2))) {  
 Object v1 = getValue();  
 Object v2 = e.getValue();  
 if (v1 == v2 || (v1 != null && v1.equals(v2)))  
  return true;  
}  
return false;  
  }  
 
  // ʵÏÖhashCode()  
  public final int hashCode() {  
return (key==null 0 : key.hashCode()) ^  
 (value==null  0 : value.hashCode());  
  }  
 
  public final String toString() {  
return getKey() + "=" + getValue();  
  }  
 
  // µ±ÏòHashMapÖÐÌí¼ÓÔªËØÊ±£¬»æµ÷ÓÃrecordAccess()¡£  
  // ÕâÀï²»×öÈκδ¦Àí  
  void recordAccess(HashMap m) {  
  }  
 
  // µ±´ÓHashMapÖÐɾ³ýÔªËØÊ±£¬»æµ÷ÓÃrecordRemoval()¡£  
  // ÕâÀï²»×öÈκδ¦Àí  
  void recordRemoval(HashMap m) {  
  }  
 }

ËüµÄ½á¹¹ÔªËسýÁËkey¡¢value¡¢hashÍ⣬»¹ÓÐnext£¬nextÖ¸ÏòÏÂÒ»¸ö½Úµã¡£ÁíÍ⣬ÕâÀ︲дÁËequalsºÍhashCode·½·¨À´±£Ö¤¼üÖµ¶ÔµÄ¶ÀÒ»ÎÞ¶þ¡£

HashMap¹²ÓÐËĸö¹¹Ôì·½·¨¡£¹¹Ôì·½·¨ÖÐÌáµ½ÁËÁ½¸öºÜÖØÒªµÄ²ÎÊý£º³õʼÈÝÁ¿ºÍ¼ÓÔØÒò×Ó¡£ÕâÁ½¸ö²ÎÊýÊÇÓ°ÏìHashMapÐÔÄܵÄÖØÒª²ÎÊý£¬ÆäÖÐÈÝÁ¿±íʾ¹þÏ£±íÖв۵ÄÊýÁ¿£¨¼´¹þÏ£Êý×éµÄ³¤¶È£©£¬³õʼÈÝÁ¿ÊÇ´´½¨¹þÏ£±íʱµÄÈÝÁ¿£¨´Ó¹¹Ô캯ÊýÖпÉÒÔ¿´³ö£¬Èç¹û²»Ö¸Ã÷£¬ÔòĬÈÏΪ16£©£¬¼ÓÔØÒò×ÓÊǹþÏ£±íÔÚÆäÈÝÁ¿×Ô¶¯Ôö¼Ó֮ǰ¿ÉÒÔ´ïµ½¶àÂúµÄÒ»Öֳ߶È£¬µ±¹þÏ£±íÖеÄÌõÄ¿Êý³¬³öÁ˼ÓÔØÒò×ÓÓ뵱ǰÈÝÁ¿µÄ³Ë»ýʱ£¬ÔòÒª¶Ô¸Ã¹þÏ£±í½øÐÐ resize ²Ù×÷£¨¼´À©ÈÝ£©¡£

ÏÂÃæËµÏ¼ÓÔØÒò×Ó£¬Èç¹û¼ÓÔØÒò×ÓÔ½´ó£¬¶Ô¿Õ¼äµÄÀûÓøü³ä·Ö£¬µ«ÊDzéÕÒЧÂʻήµÍ£¨Á´±í³¤¶È»áÔ½À´Ô½³¤£©£»Èç¹û¼ÓÔØÒò×Ó̫С£¬ÄÇô±íÖеÄÊý¾Ý½«¹ýÓÚÏ¡Ê裨ºÜ¶à¿Õ¼ä»¹Ã»Ó㬾ͿªÊ¼À©ÈÝÁË£©£¬¶Ô¿Õ¼äÔì³ÉÑÏÖØÀË·Ñ¡£Èç¹ûÎÒÃÇÔÚ¹¹Ôì·½·¨Öв»Ö¸¶¨£¬ÔòϵͳĬÈϼÓÔØÒò×ÓΪ0.75£¬ÕâÊÇÒ»¸ö±È½ÏÀíÏëµÄÖµ£¬Ò»°ãÇé¿öÏÂÎÒÃÇÊÇÎÞÐèÐ޸ĵÄ¡£

ÁíÍ⣬ÎÞÂÛÎÒÃÇÖ¸¶¨µÄÈÝÁ¿Îª¶àÉÙ£¬¹¹Ôì·½·¨¶¼»á½«Êµ¼ÊÈÝÁ¿ÉèΪ²»Ð¡ÓÚÖ¸¶¨ÈÝÁ¿µÄ2µÄ´Î·½µÄÒ»¸öÊý£¬ÇÒ×î´óÖµ²»Äܳ¬¹ý2µÄ30´Î·½

HashMapÖÐkeyºÍvalue¶¼ÔÊÐíΪnull¡£

ÒªÖØµã·ÖÎöÏÂHashMapÖÐÓõÄ×î¶àµÄÁ½¸ö·½·¨putºÍget¡£ÏȴӱȽϼòµ¥µÄget·½·¨×ÅÊÖ£¬Ô´ÂëÈçÏ£º

  // »ñÈ¡key¶ÔÓ¦µÄvalue  
 public V get(Object key) {  
  if (key == null)  
return getForNullKey();  
  // »ñÈ¡keyµÄhashÖµ  
  int hash = hash(key.hashCode());  
  // ÔÚ“¸ÃhashÖµ¶ÔÓ¦µÄÁ´±í”ÉϲéÕÒ“¼üÖµµÈÓÚkey”µÄÔªËØ  
  for (Entry e = table[indexFor(hash, table.length)];  
 e != null;  
 e = e.next) {  
Object k;  
			//ÅжÏkeyÊÇ·ñÏàͬ
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
 return e.value;  
  }
		//ûÕÒµ½Ôò·µ»Ønull
  return null;  
 }  
 
 // »ñÈ¡“keyΪnull”µÄÔªËØµÄÖµ  
 // HashMap½«“keyΪnull”µÄÔªËØ´æ´¢ÔÚtable[0]λÖ㬵«²»Ò»¶¨ÊǸÃÁ´±íµÄµÚÒ»¸öλÖã¡  
 private V getForNullKey() {  
  for (Entry e = table[0]; e != null; e = e.next) {  
if (e.key == null)  
 return e.value;  
  }  
  return null;  
 } 

Ê×ÏÈ£¬Èç¹ûkeyΪnull£¬ÔòÖ±½Ó´Ó¹þÏ£±íµÄµÚÒ»¸öλÖÃtable[0]¶ÔÓ¦µÄÁ´±íÉϲéÕÒ¡£¼Çס£¬keyΪnullµÄ¼üÖµ¶ÔÓÀÔ¶¶¼·ÅÔÚÒÔtable[0]Ϊͷ½áµãµÄÁ´±íÖУ¬µ±È»²»Ò»¶¨ÊÇ´æ·ÅÔÚÍ·½áµãtable[0]ÖС£

Èç¹ûkey²»Îªnull£¬ÔòÏÈÇóµÄkeyµÄhashÖµ£¬¸ù¾ÝhashÖµÕÒµ½ÔÚtableÖеÄË÷Òý£¬ÔÚ¸ÃË÷Òý¶ÔÓ¦µÄµ¥Á´±íÖвéÕÒÊÇ·ñÓмüÖµ¶ÔµÄkeyÓëÄ¿±êkeyÏàµÈ£¬Óоͷµ»Ø¶ÔÓ¦µÄvalue£¬Ã»ÓÐÔò·µ»Ønull¡£

put·½·¨ÉÔ΢¸´ÔÓЩ£¬´úÂëÈçÏ£º

// ½«“key-value”Ìí¼Óµ½HashMapÖÐ  
 public V put(K key, V value) {  
  // Èô“keyΪnull”£¬Ôò½«¸Ã¼üÖµ¶ÔÌí¼Óµ½table[0]ÖС£  
  if (key == null)  
return putForNullKey(value);  
  // Èô“key²»Îªnull”£¬Ôò¼ÆËã¸ÃkeyµÄ¹þÏ£Öµ£¬È»ºó½«ÆäÌí¼Óµ½¸Ã¹þÏ£Öµ¶ÔÓ¦µÄÁ´±íÖС£  
  int hash = hash(key.hashCode());  
  int i = indexFor(hash, table.length);  
  for (Entry e = table[i]; e != null; e = e.next) {  
Object k;  
// Èô“¸Ãkey”¶ÔÓ¦µÄ¼üÖµ¶ÔÒѾ­´æÔÚ£¬ÔòÓÃеÄvalueÈ¡´ú¾ÉµÄvalue¡£È»ºóÍ˳ö£¡  
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
 V oldValue = e.value;  
 e.value = value;  
 e.recordAccess(this);  
 return oldValue;  
}  
  }  
 
  // Èô“¸Ãkey”¶ÔÓ¦µÄ¼üÖµ¶Ô²»´æÔÚ£¬Ôò½«“key-value”Ìí¼Óµ½tableÖÐ  
  modCount++;
		//½«key-valueÌí¼Óµ½table[i]´¦
  addEntry(hash, key, value, i);  
  return null;  
 }

Èç¹ûkeyΪnull£¬Ôò½«ÆäÌí¼Óµ½table[0]¶ÔÓ¦µÄÁ´±íÖУ¬putForNullKeyµÄÔ´ÂëÈçÏ£º

// putForNullKey()µÄ×÷ÓÃÊǽ«“keyΪnull”¼üÖµ¶ÔÌí¼Óµ½table[0]λÖà  
 private V putForNullKey(V value) {  
  for (Entry e = table[0]; e != null; e = e.next) {  
if (e.key == null) {  
 V oldValue = e.value;  
 e.value = value;  
 e.recordAccess(this);  
 return oldValue;  
}  
  }  
  // Èç¹ûûÓдæÔÚkeyΪnullµÄ¼üÖµ¶Ô£¬ÔòÖ±½ÓÌâ°¢¼ûµ½table[0]´¦!  
  modCount++;  
  addEntry(0, null, value, 0);  
  return null;  
 }

Èç¹ûkey²»Îªnull£¬ÔòͬÑùÏÈÇó³ökeyµÄhashÖµ£¬¸ù¾ÝhashÖµµÃ³öÔÚtableÖеÄË÷Òý£¬¶øºó±éÀú¶ÔÓ¦µÄµ¥Á´±í£¬Èç¹ûµ¥Á´±íÖдæÔÚÓëÄ¿±êkeyÏàµÈµÄ¼üÖµ¶Ô£¬Ôò½«ÐµÄvalue¸²¸Ç¾ÉµÄvalue£¬±È½«¾ÉµÄvalue·µ»Ø£¬Èç¹ûÕÒ²»µ½ÓëÄ¿±êkeyÏàµÈµÄ¼üÖµ¶Ô£¬»òÕ߸õ¥Á´±íΪ¿Õ£¬Ôò½«¸Ã¼üÖµ¶Ô²åÈëµ½¸Äµ¥Á´±íµÄÍ·½áµãλÖã¨Ã¿´ÎвåÈëµÄ½Úµã¶¼ÊÇ·ÅÔÚÍ·½áµãµÄλÖã©£¬¸Ã²Ù×÷ÊÇÓÐaddEntry·½·¨ÊµÏֵģ¬ËüµÄÔ´ÂëÈçÏ£º

// ÐÂÔöEntry¡£½«“key-value”²åÈëÖ¸¶¨Î»Öã¬bucketIndexÊÇλÖÃË÷Òý¡£  
 void addEntry(int hash, K key, V value, int bucketIndex) {  
  // ±£´æ“bucketIndex”λÖõÄÖµµ½“e”ÖÐ  
  Entry e = table[bucketIndex];  
  // ÉèÖÓbucketIndex”λÖõÄÔªËØÎª“ÐÂEntry”£¬  
  // ÉèÖÓe”Ϊ“ÐÂEntryµÄÏÂÒ»¸ö½Úµã”  
  table[bucketIndex] = new Entry(hash, key, value, e);  
  // ÈôHashMapµÄʵ¼Ê´óС ²»Ð¡ÓÚ “ãÐÖµ”£¬Ôòµ÷ÕûHashMapµÄ´óС  
  if (size++ >= threshold)  
resize(2 * table.length);  
 } 

×¢ÒâÕâÀïµ¹ÊýµÚÈýÐеĹ¹Ôì·½·¨£¬½«key-value¼üÖµ¶Ô¸³¸øtable[bucketIndex]£¬²¢½«ÆänextÖ¸ÏòÔªËØe£¬Õâ±ã½«key-value·Åµ½ÁËÍ·½áµãÖУ¬²¢½«Ö®Ç°µÄÍ·½áµã½ÓÔÚÁËËüµÄºóÃæ¡£¸Ã·½·¨Ò²ËµÃ÷£¬Ã¿´Îput¼üÖµ¶ÔµÄʱºò£¬×ÜÊǽ«ÐµĸüüÖµ¶Ô·ÅÔÚtable[bucketIndex]´¦£¨¼´Í·½áµã´¦£©¡£

Á½Íâ×¢Òâ×îºóÁ½ÐдúÂ룬ÿ´Î¼ÓÈë¼üÖµ¶Ôʱ£¬¶¼ÒªÅжϵ±Ç°ÒÑÓõIJ۵ÄÊýÄ¿ÊÇ·ñ´óÓÚµÈÓÚ·§Öµ£¨ÈÝÁ¿*¼ÓÔØÒò×Ó£©£¬Èç¹û´óÓÚµÈÓÚ£¬Ôò½øÐÐÀ©ÈÝ£¬½«ÈÝÁ¿À©ÎªÔ­À´ÈÝÁ¿µÄ2±¶¡£

6¡¢¹ØÓÚÀ©ÈÝ¡£ÉÏÃæÎÒÃÇ¿´µ½ÁËÀ©Èݵķ½·¨£¬resize·½·¨£¬ËüµÄÔ´ÂëÈçÏ£º

 // ÖØÐµ÷ÕûHashMapµÄ´óС£¬newCapacityÊǵ÷ÕûºóµÄµ¥Î»  
 void resize(int newCapacity) {  
  Entry[] oldTable = table;  
  int oldCapacity = oldTable.length;  
  if (oldCapacity == MAXIMUM_CAPACITY) {  
threshold = Integer.MAX_VALUE;  
return;  
  }  
 
  // н¨Ò»¸öHashMap£¬½«“¾ÉHashMap”µÄÈ«²¿ÔªËØÌí¼Óµ½“ÐÂHashMap”ÖУ¬  
  // È»ºó£¬½«“ÐÂHashMap”¸³Öµ¸ø“¾ÉHashMap”¡£  
  Entry[] newTable = new Entry[newCapacity];  
  transfer(newTable);  
  table = newTable;  
  threshold = (int)(newCapacity * loadFactor);  
 } 

ºÜÃ÷ÏÔ£¬ÊÇн¨ÁËÒ»¸öHashMapµÄµ×²ãÊý×飬¶øºóµ÷ÓÃtransfer·½·¨£¬½«¾ÍHashMapµÄÈ«²¿ÔªËØÌí¼Óµ½ÐµÄHashMapÖУ¨ÒªÖØÐ¼ÆËãÔªËØÔÚеÄÊý×éÖеÄË÷ÒýλÖã©¡£transfer·½·¨µÄÔ´ÂëÈçÏ£º

// ½«HashMapÖеÄÈ«²¿ÔªËض¼Ìí¼Óµ½newTableÖÐ  
 void transfer(Entry[] newTable) {  
  Entry[] src = table;  
  int newCapacity = newTable.length;  
  for (int j = 0; j < src.length; j++) {  
Entry e = src[j];  
if (e != null) {  
 src[j] = null;  
 do {  
  Entry next = e.next;  
  int i = indexFor(e.hash, newCapacity);  
  e.next = newTable[i];  
  newTable[i] = e;  
  e = next;  
 } while (e != null);  
}  
  }  
 } 

ºÜÃ÷ÏÔ£¬À©ÈÝÊÇÒ»¸öÏ൱ºÄʱµÄ²Ù×÷£¬ÒòΪËüÐèÒªÖØÐ¼ÆËãÕâÐ©ÔªËØÔÚеÄÊý×éÖеÄλÖò¢½øÐи´ÖÆ´¦Àí¡£Òò´Ë£¬ÎÒÃÇÔÚÓÃHashMapµÄʱ£¬×îºÃÄÜÌáǰԤ¹ÀÏÂHashMapÖÐÔªËØµÄ¸öÊý£¬ÕâÑùÓÐÖúÓÚÌá¸ßHashMapµÄÐÔÄÜ¡£

7¡¢×¢ÒâcontainsKey·½·¨ºÍcontainsValue·½·¨¡£Ç°ÕßÖ±½Ó¿ÉÒÔͨ¹ýkeyµÄ¹þÏ£Öµ½«ËÑË÷·¶Î§¶¨Î»µ½Ö¸¶¨Ë÷Òý¶ÔÓ¦µÄÁ´±í£¬¶øºóÕßÒª¶Ô¹þÏ£Êý×éµÄÿ¸öÁ´±í½øÐÐËÑË÷¡£

8¡¢ÎÒÃÇÖØµãÀ´·ÖÎöÏÂÇóhashÖµºÍË÷ÒýÖµµÄ·½·¨£¬ÕâÁ½¸ö·½·¨±ãÊÇHashMapÉè¼ÆµÄ×îΪºËÐĵIJ¿·Ö£¬¶þÕß½áºÏÄܱ£Ö¤¹þÏ£±íÖеÄÔªËØ¾¡¿ÉÄܾùÔȵØÉ¢ÁС£

¼ÆËã¹þÏ£ÖµµÄ·½·¨ÈçÏ£º

static int hash(int h) {
  h ^= (h >>> 20) ^ (h >>> 12);
  return h ^ (h >>> 7) ^ (h >>> 4);
 }

ËüÖ»ÊÇÒ»¸öÊýѧ¹«Ê½£¬IDKÕâÑùÉè¼Æ¶ÔhashÖµµÄ¼ÆË㣬×ÔÈ»ÓÐËüµÄºÃ´¦£¬ÖÁÓÚΪʲôÕâÑùÉè¼Æ£¬ÎÒÃÇÕâÀﲻȥ׷¾¿£¬Ö»ÒªÃ÷°×Ò»µã£¬ÓõÄλµÄ²Ù×÷ʹhashÖµµÄ¼ÆËãЧÂʺܸß¡£

ÓÉhashÖµÕÒµ½¶ÔÓ¦Ë÷ÒýµÄ·½·¨ÈçÏ£º

static int indexFor(int h, int length) {
  return h & (length-1);
 }

Õâ¸öÎÒÃÇÒªÖØµã˵Ï£¬ÎÒÃÇÒ»°ã¶Ô¹þÏ£±íµÄÉ¢ÁкÜ×ÔÈ»µØ»áÏëµ½ÓÃhashÖµ¶Ôlengthȡ죍¼´³ý·¨É¢Áз¨£©£¬HashtableÖÐÒ²ÊÇÕâÑùʵÏֵģ¬ÕâÖÖ·½·¨»ù±¾Äܱ£Ö¤ÔªËØÔÚ¹þÏ£±íÖÐÉ¢ÁеıȽϾùÔÈ£¬µ«È¡Ä£»áÓõ½³ý·¨ÔËË㣬ЧÂʺܵÍ£¬HashMapÖÐÔòͨ¹ýh&(length-1)µÄ·½·¨À´´úÌæÈ¡Ä££¬Í¬ÑùʵÏÖÁ˾ùÔȵÄÉ¢ÁУ¬µ«Ð§ÂÊÒª¸ßºÜ¶à£¬ÕâÒ²ÊÇHashMap¶ÔHashtableµÄÒ»¸ö¸Ä½ø¡£

½ÓÏÂÀ´£¬ÎÒÃÇ·ÖÎöÏÂΪʲô¹þÏ£±íµÄÈÝÁ¿Ò»¶¨ÒªÊÇ2µÄÕûÊý´ÎÃÝ¡£Ê×ÏÈ£¬lengthΪ2µÄÕûÊý´ÎÃݵϰ£¬h&(length-1)¾ÍÏ൱ÓÚ¶Ôlengthȡ죬ÕâÑù±ã±£Ö¤ÁËÉ¢ÁеľùÔÈ£¬Í¬Ê±Ò²ÌáÉýÁËЧÂÊ£»Æä´Î£¬lengthΪ2µÄÕûÊý´ÎÃݵϰ£¬ÎªÅ¼Êý£¬ÕâÑùlength-1ÎªÆæÊý£¬ÆæÊýµÄ×îºóһλÊÇ1£¬ÕâÑù±ã±£Ö¤ÁËh&(length-1)µÄ×îºóһλ¿ÉÄÜΪ0£¬Ò²¿ÉÄÜΪ1£¨ÕâÈ¡¾öÓÚhµÄÖµ£©£¬¼´ÓëºóµÄ½á¹û¿ÉÄÜΪżÊý£¬Ò²¿ÉÄÜÎªÆæÊý£¬ÕâÑù±ã¿ÉÒÔ±£Ö¤É¢ÁеľùÔÈÐÔ£¬¶øÈç¹ûlengthÎªÆæÊýµÄ»°£¬ºÜÃ÷ÏÔlength-1ΪżÊý£¬ËüµÄ×îºóһλÊÇ0£¬ÕâÑùh&(length-1)µÄ×îºóһλ¿Ï¶¨Îª0£¬¼´Ö»ÄÜΪżÊý£¬ÕâÑùÈκÎhashÖµ¶¼Ö»»á±»É¢Áе½Êý×éµÄżÊýϱêλÖÃÉÏ£¬Õâ±ãÀË·ÑÁ˽üÒ»°ëµÄ¿Õ¼ä£¬Òò´Ë£¬lengthÈ¡2µÄÕûÊý´ÎÃÝ£¬ÊÇΪÁËʹ²»Í¬hashÖµ·¢ÉúÅöײµÄ¸ÅÂʽÏС£¬ÕâÑù¾ÍÄÜÊ¹ÔªËØÔÚ¹þÏ£±íÖоùÔȵØÉ¢ÁС£

Èý¡¢TreeMapÔ´Âë½â¶Á

1£©TreeMapµÄÌØµã

2£©TreeMapµÄÔ´Âë½²½â£¨jdk1.7£©²Î¿¼¸½ÊôÎļþµÄ´úÂ룬ԭÎÄÖÐÓÐ×¢½â£¬ÏÂÔØ

3£©TreeMapµÄ×ܽá

ËÄ¡¢WeakHashMapÔ´Âë½â¶Á

1£©WeakHashMapµÄÌØµã

2£©WeakHashMapµÄÔ´Âë½²½â£¨jdk1.7£©²Î¿¼¸½ÊôÎļþµÄ´úÂ룬ԭÎÄÖÐÓÐ×¢½â£¬ÏÂÔØ

3£©WeakHashMapµÄ×ܽá

Îå¡¢HashTableÔ´Âë½â¶Á

1£©HashTableµÄÌØµã

HashtableͬÑùÊÇ»ùÓÚ¹þÏ£±íʵÏֵģ¬Í¬Ñùÿ¸öÔªËØÊÇÒ»¸ökey-value¶Ô£¬ÆäÄÚ²¿Ò²ÊÇͨ¹ýµ¥Á´±í½â¾ö³åÍ»ÎÊÌ⣬ÈÝÁ¿²»×㣨³¬¹ýÁË·§Öµ£©Ê±£¬Í¬Ñù»á×Ô¶¯Ôö³¤¡£

HashtableÒ²ÊÇJDK1.0ÒýÈëµÄÀ࣬ÊÇḬ̈߳²È«µÄ£¬ÄÜÓÃÓÚ¶àÏ̻߳·¾³ÖС£

HashtableͬÑùʵÏÖÁËSerializable½Ó¿Ú£¬ËüÖ§³ÖÐòÁл¯£¬ÊµÏÖÁËCloneable½Ó¿Ú£¬Äܱ»¿Ë¡¡£

2£©HashTableµÄÔ´Âë½²½â£¨jdk1.7£©²Î¿¼¸½ÊôÎļþµÄ´úÂ룬ԭÎÄÖÐÓÐ×¢½â£¬ÏÂÔØ

3£©HashTableµÄ×ܽá

Õë¶Ô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µÄÔ´Â룺

// ÅжÏHashtableÊÇ·ñ°üº¬“Öµ(value)”  
 public synchronized boolean contains(Object value) {  
  //×¢Ò⣬HashtableÖеÄvalue²»ÄÜÊÇnull£¬  
  // ÈôÊÇnullµÄ»°£¬Å׳öÒì³£!  
  if (value == null) {  
throw new NullPointerException();  
  }  
 
  // ´ÓºóÏòǰ±éÀútableÊý×éÖеÄÔªËØ(Entry)  
  // ¶ÔÓÚÿ¸öEntry(µ¥ÏòÁ´±í)£¬Öð¸ö±éÀú£¬ÅжϽڵãµÄÖµÊÇ·ñµÈÓÚvalue  
  Entry tab[] = table;  
  for (int i = tab.length ; i-- > 0 ;) {  
for (Entry 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);  
 }  
 
 // ÅжÏHashtableÊÇ·ñ°üº¬key  
 public synchronized boolean containsKey(Object key) {  
  Entry tab[] = table;  
		//¼ÆËãhashÖµ£¬Ö±½ÓÓÃkeyµÄhashCode´úÌæ
  int hash = key.hashCode(); 
  // ¼ÆËãÔÚÊý×éÖеÄË÷ÒýÖµ 
  int index = (hash & 0x7FFFFFFF) % tab.length;  
  // ÕÒµ½“key¶ÔÓ¦µÄEntry(Á´±í)”£¬È»ºóÔÚÁ´±íÖÐÕÒ³ö“¹þÏ£Öµ”ºÍ“¼üÖµ”Óëkey¶¼ÏàµÈµÄÔªËØ  
  for (Entry 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ºó£¬Ö»ÓзûºÅÍâ¸Ä±ä£¬¶øºóÃæµÄλ¶¼²»±ä¡£

µã»÷¸´ÖÆÁ´½Ó ÓëºÃÓÑ·ÖÏí!»Ø±¾Õ¾Ê×Ò³
ÉÏһƪ£ºjava¿ª·¢Ñ§Ï°Ö®JettyµÄ¹¤×÷Ô­Àí½²½â
ÏÂһƪ£ºJava¹ØÓÚ±êʶ·ûÓë¹Ø¼ü×ÖµÄ֪ʶ×ܽá
Ïà¹ØÎÄÕÂ
ͼÎÄÍÆ¼ö
µã»÷ÅÅÐÐ

¹ØÓÚÎÒÃÇ | ÁªÏµÎÒÃÇ | ¹ã¸æ·þÎñ | Ͷ×ʺÏ×÷ | °æÈ¨ÉêÃ÷ | ÔÚÏß°ïÖú | ÍøÕ¾µØÍ¼ | ×÷Æ··¢²¼ | Vip¼¼ÊõÅàѵ | ¾Ù±¨ÖÐÐÄ

°æÈ¨ËùÓÐ: È«·å°²È«ÁªÃË--ÖÂÁ¦ÓÚ×öʵÓõÄIT¼¼ÊõÑ§Ï°ÍøÕ¾