Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java HashMap¹¤×÷Ô­ÀíÉîÈë̽ÌÖ
 
À´Ô´£º51CTO ·¢²¼ÓÚ 2015-10-15
  2002  次浏览      29
 

´ó²¿·ÖJava¿ª·¢Õß¶¼ÔÚʹÓÃMap£¬ÌرðÊÇHashMap¡£HashMapÊÇÒ»ÖÖ¼òµ¥µ«Ç¿´óµÄ·½Ê½È¥´æ´¢ºÍ»ñÈ¡Êý¾Ý¡£µ«ÓжàÉÙ¿ª·¢ÕßÖªµÀ HashMapÄÚ²¿ÈçºÎ¹¤×÷ÄØ£¿¼¸Ììǰ£¬ÎÒÔĶÁÁËjava.util.HashMapµÄ´óÁ¿Ô´´úÂ루°üÀ¨Java 7 ºÍJava 8£©£¬À´ÉîÈëÀí½âÕâ¸ö»ù´¡µÄÊý¾Ý½á¹¹¡£ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒ»á½âÊÍjava.util.HashMapµÄʵÏÖ£¬ÃèÊöJava 8ʵÏÖÖÐÌí¼ÓµÄÐÂÌØÐÔ£¬²¢ÌÖÂÛÐÔÄÜ¡¢ÄÚ´æÒÔ¼°Ê¹ÓÃHashMapʱµÄһЩÒÑÖªÎÊÌâ¡£

ÄÚ²¿´æ´¢

Java HashMapÀàʵÏÖÁËMap<K, V>½Ó¿Ú¡£Õâ¸ö½Ó¿ÚÖеÄÖ÷Òª·½·¨°üÀ¨£º 

V put(K key, V value)

V get(Object key)

V remove(Object key)

Boolean containsKey(Object key)

HashMapʹÓÃÁËÒ»¸öÄÚ²¿ÀàEntry<K, V>À´´æ´¢Êý¾Ý¡£Õâ¸öÄÚ²¿ÀàÊÇÒ»¸ö¼òµ¥µÄ¼üÖµ¶Ô£¬²¢´øÓжîÍâÁ½¸öÊý¾Ý£º

Ò»¸öÖ¸ÏòÆäËûÈë¿Ú£¨ÒëÕß×¢£ºÒýÓöÔÏ󣩵ÄÒýÓã¬ÕâÑùHashMap¿ÉÒÔ´æ´¢ÀàËÆÁ´½ÓÁбíÕâÑùµÄ¶ÔÏó¡£

Ò»¸öÓÃÀ´´ú±í¼üµÄ¹þÏ£Öµ£¬´æ´¢Õâ¸öÖµ¿ÉÒÔ±ÜÃâHashMapÔÚÿ´ÎÐèҪʱ¶¼ÖØÐÂÉú³É¼üËù¶ÔÓ¦µÄ¹þÏ£Öµ¡£

ÏÂÃæÊÇEntry<K, V>ÔÚJava 7ϵÄÒ»²¿·Ö´úÂ룺

static class Entry<K,V> implements Map.Entry<K,V> { 
final K key;
V value;
Entry<K,V> next;
int hash;
¡­
}

HashMap½«Êý¾Ý´æ´¢µ½¶à¸öµ¥ÏòEntryÁ´±íÖУ¨ÓÐʱҲ±»³ÆÎªÍ°bucket»òÕßÈÝÆ÷orbins£©¡£ËùÓеÄÁÐ±í¶¼±»×¢²áµ½Ò»¸öEntryÊý×éÖУ¨Entry<K, V>[]Êý×飩£¬Õâ¸öÄÚ²¿Êý×éµÄĬÈϳ¤¶ÈÊÇ16¡£

ÏÂÃæÕâ·ùͼÃèÊöÁËÒ»¸öHashMapʵÀýµÄÄÚ²¿´æ´¢£¬Ëü°üº¬Ò»¸önullable¶ÔÏó×é³ÉµÄÊý×顣ÿ¸ö¶ÔÏó¶¼Á¬½Óµ½ÁíÍâÒ»¸ö¶ÔÏó£¬ÕâÑù¾Í¹¹³ÉÁËÒ»¸öÁ´±í¡£

ËùÓоßÓÐÏàͬ¹þÏ£ÖµµÄ¼ü¶¼»á±»·Åµ½Í¬Ò»¸öÁ´±í£¨Í°£©ÖС£¾ßÓв»Í¬¹þÏ£ÖµµÄ¼ü×îÖÕ¿ÉÄÜ»áÔÚÏàͬµÄͰÖС£

µ±Óû§µ÷Óà put(K key£¬ V value) »òÕß get(Object key) ʱ£¬³ÌÐò»á¼ÆËã¶ÔÏóÓ¦¸ÃÔÚµÄͰµÄË÷Òý¡£È»ºó£¬³ÌÐò»áµü´ú±éÀú¶ÔÓ¦µÄÁÐ±í£¬À´Ñ°ÕÒ¾ßÓÐÏàͬ¼üµÄEntry¶ÔÏó£¨Ê¹ÓüüµÄequals()·½·¨£©¡£

¶ÔÓÚµ÷ÓÃget()µÄÇé¿ö£¬³ÌÐò»á·µ»ØÖµËù¶ÔÓ¦µÄEntry¶ÔÏó£¨Èç¹ûEntry¶ÔÏó´æÔÚ£©¡£

¶ÔÓÚµ÷ÓÃput(K key, V value)µÄÇé¿ö£¬Èç¹ûEntry¶ÔÏóÒѾ­´æÔÚ£¬ÄÇô³ÌÐò»á½«ÖµÌ滻ΪÐÂÖµ£¬·ñÔò£¬³ÌÐò»áÔÚµ¥ÏòÁ´±íµÄ±íÍ·´´½¨Ò»¸öеÄEntry£¨´Ó²ÎÊýÖеļüºÍÖµ£©¡£

Ͱ£¨Á´±í£©µÄË÷Òý£¬ÊÇͨ¹ýmapµÄ3¸ö²½ÖèÉú³ÉµÄ£º

Ê×ÏÈ»ñÈ¡¼üµÄÉ¢ÁÐÂë¡£

³ÌÐòÖØ¸´É¢ÁÐÂ룬À´×èÖ¹Õë¶Ô¼üµÄÔã¸âµÄ¹þÏ£º¯Êý£¬ÒòΪÕâÓпÉÄܻὫËùÓеÄÊý¾Ý¶¼·Åµ½ÄÚ²¿Êý×éµÄÏàͬµÄË÷Òý£¨Í°£©ÉÏ¡£

³ÌÐòÄõ½Öظ´ºóµÄÉ¢ÁÐÂ룬²¢¶ÔÆäʹÓÃÊý×鳤¶È£¨×îСÊÇ1£©µÄλÑÚÂ루bit-mask£©¡£Õâ¸ö²Ù×÷¿ÉÒÔ±£Ö¤Ë÷Òý²»»á´óÓÚÊý×éµÄ´óС¡£Äã¿ÉÒÔ½«Æä¿´×öÊÇÒ»¸ö¾­¹ý¼ÆËãµÄÓÅ»¯È¡Ä£º¯Êý¡£

ÏÂÃæÊÇÉú³ÉË÷ÒýµÄÔ´´úÂ룺

// the "rehash" function in JAVA 7 that takes the hashcode of the key 
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
// the "rehash" function in JAVA 8 that directly takes the key
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// the function that returns the index from the rehashed hash
static int indexFor(int h, int length) {
return h & (length-1);
}

ΪÁ˸üÓÐЧµØ¹¤×÷£¬ÄÚ²¿Êý×éµÄ´óС±ØÐëÊÇ2µÄÃÝÖµ¡£ÈÃÎÒÃÇ¿´Ò»ÏÂΪʲô£º

¼ÙÉèÊý×éµÄ³¤¶ÈÊÇ17£¬ÄÇôÑÚÂëµÄÖµ¾ÍÊÇ16£¨Êý×鳤¶È-1£©¡£16µÄ¶þ½øÖƱíʾÊÇ0¡­010000£¬ÕâÑù¶ÔÓÚÈκÎÖµHÀ´Ëµ£¬¡°H & 16¡±µÄ½á¹û¾ÍÊÇ16»òÕß0¡£ÕâÒâζ×ų¤¶ÈΪ17µÄÊý×éÖ»ÄÜÓ¦Óõ½Á½¸öͰÉÏ£ºÒ»¸öÊÇ0£¬ÁíÍâÒ»¸öÊÇ16£¬ÕâÑù²»ÊǺÜÓÐЧÂÊ¡£µ«ÊÇÈç¹ûÄ㽫Êý×éµÄ³¤¶ÈÉèÖÃΪ 2µÄÃÝÖµ£¬ÀýÈç16£¬ÄÇô°´Î»Ë÷ÒýµÄ¹¤×÷±ä³É¡°H & 15¡±¡£15µÄ¶þ½øÖƱíʾÊÇ0¡­001111£¬Ë÷Òý¹«Ê½Êä³öµÄÖµ¿ÉÒÔ´Ó0µ½15£¬ÕâÑù³¤¶ÈΪ16µÄÊý×é¾Í¿ÉÒÔ±»³ä·ÖʹÓÃÁË¡£ÀýÈ磺

Èç¹ûH = 952£¬ËüµÄ¶þ½øÖƱíʾÊÇ0..01110111000£¬¶ÔÓ¦µÄË÷ÒýÊÇ0¡­01000 = 8

Èç¹ûH = 1576£¬ËüµÄ¶þ½øÖƱíʾÊÇ0..011000101000£¬¶ÔÓ¦µÄË÷ÒýÊÇ0¡­01000 = 8

Èç¹ûH = 12356146£¬ËüµÄ¶þ½øÖƱíʾÊÇ0..0101111001000101000110010£¬¶ÔÓ¦µÄË÷ÒýÊÇ0¡­00010 = 2

Èç¹ûH = 59843£¬ËüµÄ¶þ½øÖƱíʾÊÇ0..01110100111000011£¬Ëü¶ÔÓ¦µÄË÷ÒýÊÇ0¡­00011 = 3

ÕâÖÖ»úÖÆ¶ÔÓÚ¿ª·¢ÕßÀ´ËµÊÇ͸Ã÷µÄ£ºÈç¹ûËûÑ¡ÔñÒ»¸ö³¤¶ÈΪ37µÄHashMap£¬Map»á×Ô¶¯Ñ¡ÔñÏÂÒ»¸ö´óÓÚ37µÄ2µÄÃÝÖµ£¨64£©×÷ΪÄÚ²¿Êý×éµÄ³¤¶È¡£

×Ô¶¯µ÷Õû´óС

ÔÚ»ñÈ¡Ë÷Òýºó£¬get()¡¢put()»òÕßremove()·½·¨»á·ÃÎʶÔÓ¦µÄÁ´±í£¬À´²é¿´Õë¶ÔÖ¸¶¨¼üµÄEntry¶ÔÏóÊÇ·ñÒѾ­´æÔÚ¡£ÔÚ²»×öÐ޸ĵÄÇé ¿öÏ£¬Õâ¸ö»úÖÆ¿ÉÄܻᵼÖÂÐÔÄÜÎÊÌ⣬ÒòΪÕâ¸ö·½·¨ÐèÒªµü´úÕû¸öÁбíÀ´²é¿´Entry¶ÔÏóÊÇ·ñ´æÔÚ¡£¼ÙÉèÄÚ²¿Êý×éµÄ³¤¶È²ÉÓÃĬÈÏÖµ16£¬¶øÄãÐèÒª´æ´¢ 2£¬000,000Ìõ¼Ç¼¡£ÔÚ×îºÃµÄÇé¿öÏ£¬Ã¿¸öÁ´±í»áÓÐ125,000¸öEntry¶ÔÏó£¨2,000,000/16£©¡£get()¡¢remove()ºÍ put()·½·¨ÔÚÿһ´ÎÖ´ÐÐʱ£¬¶¼ÐèÒª½øÐÐ125,000´Îµü´ú¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬HashMap¿ÉÒÔÔö¼ÓÄÚ²¿Êý×éµÄ³¤¶È£¬´Ó¶ø±£Ö¤Á´±íÖÐÖ»±£ÁôºÜÉÙµÄ Entry¶ÔÏó¡£

µ±Äã´´½¨Ò»¸öHashMapʱ£¬Äã¿ÉÒÔͨ¹ýÒÔϹ¹Ô캯ÊýÖ¸¶¨Ò»¸ö³õʼ³¤¶È£¬ÒÔ¼°Ò»¸öloadFactor£º

public HashMap(int initialCapacity, float loadFactor)

Èç¹ûÄã²»Ö¸¶¨²ÎÊý£¬ÄÇôĬÈϵÄinitialCapacityµÄÖµÊÇ16£¬ loadFactorµÄĬÈÏÖµÊÇ0.75¡£initialCapacity´ú±íÄÚ²¿Êý×éµÄÁ´±íµÄ³¤¶È¡£

µ±Äãÿ´ÎʹÓÃput(¡­)·½·¨ÏòMapÖÐÌí¼ÓÒ»¸öеļüÖµ¶Ôʱ£¬¸Ã·½·¨»á¼ì²éÊÇ·ñÐèÒªÔö¼ÓÄÚ²¿Êý×éµÄ³¤¶È¡£ÎªÁËʵÏÖÕâÒ»µã£¬Map´æ´¢ÁË2¸öÊý¾Ý£º

MapµÄ´óС£ºËü´ú±íHashMapÖмǼµÄÌõÊý¡£ÎÒÃÇÔÚÏòHashMapÖвåÈë»òÕßɾ³ýֵʱ¸üÐÂËü¡£

·§Öµ£ºËüµÈÓÚÄÚ²¿Êý×éµÄ³¤¶È*loadFactor£¬ÔÚÿ´Îµ÷ÕûÄÚ²¿Êý×éµÄ³¤¶Èʱ£¬¸Ã·§ÖµÒ²»áͬʱ¸üС£

ÔÚÌí¼ÓеÄEntry¶ÔÏó֮ǰ£¬put(¡­)·½·¨»á¼ì²éµ±Ç°MapµÄ´óСÊÇ·ñ´óÓÚ·§Öµ¡£Èç¹û´óÓÚ·§Öµ£¬Ëü»á´´½¨Ò»¸öеÄÊý×飬Êý×鳤¶ÈÊǵ±Ç°ÄÚ²¿Êý ×éµÄÁ½±¶¡£ÒòΪÐÂÊý×éµÄ´óСÒѾ­·¢Éú¸Ä±ä£¬ËùÒÔË÷Òýº¯Êý£¨¾ÍÊÇ·µ»Ø¡°¼üµÄ¹þÏ£Öµ & (Êý×鳤¶È-1)¡±µÄλÔËËã½á¹û£©Ò²ËæÖ®¸Ä±ä¡£µ÷ÕûÊý×éµÄ´óС»á´´½¨Á½¸öеÄͰ£¨Á´±í£©£¬²¢ÇÒ½«ËùÓÐÏÖ´æEntry¶ÔÏóÖØÐ·ÖÅ䵽ͰÉÏ¡£µ÷ÕûÊý×é´óСµÄÄ¿ ±êÔÚÓÚ½µµÍÁ´±íµÄ´óС£¬´Ó¶ø½µµÍput()¡¢remove()ºÍget()·½·¨µÄÖ´ÐÐʱ¼ä¡£¶ÔÓÚ¾ßÓÐÏàͬ¹þÏ£ÖµµÄ¼üËù¶ÔÓ¦µÄËùÓÐEntry¶ÔÏóÀ´Ëµ£¬ËüÃÇ »áÔÚµ÷Õû´óСºó·ÖÅäµ½ÏàͬµÄͰÖС£µ«ÊÇ£¬Èç¹ûÁ½¸öEntry¶ÔÏóµÄ¼üµÄ¹þÏ£Öµ²»Ò»Ñù£¬µ«ËüÃÇ֮ǰÔÚͬһ¸öͰÉÏ£¬ÄÇôÔÚµ÷ÕûÒԺ󣬲¢²»Äܱ£Ö¤ËüÃÇÒÀÈ»ÔÚͬһ ¸öͰÉÏ¡£

Õâ·ùͼƬÃèÊöÁ˵÷ÕûǰºÍµ÷ÕûºóµÄÄÚ²¿Êý×éµÄÇé¿ö¡£ÔÚµ÷ÕûÊý×鳤¶È֮ǰ£¬ÎªÁ˵õ½Entry¶ÔÏóE£¬MapÐèÒªµü´ú±éÀúÒ»¸ö°üº¬5¸öÔªËØµÄÁ´±í¡£ÔÚµ÷ ÕûÊý×鳤¶ÈÖ®ºó£¬Í¬ÑùµÄget()·½·¨ÔòÖ»ÐèÒª±éÀúÒ»¸ö°üº¬2¸öÔªËØµÄÁ´±í£¬ÕâÑùget()·½·¨ÔÚµ÷ÕûÊý×鳤¶ÈºóµÄÔËÐÐËÙ¶ÈÌá¸ßÁË2±¶¡£

Ḭ̈߳²È«

Èç¹ûÄãÒѾ­·Ç³£ÊìϤHashMap£¬ÄÇôÄã¿Ï¶¨ÖªµÀËü²»ÊÇḬ̈߳²È«µÄ£¬µ«ÊÇÎªÊ²Ã´ÄØ£¿ÀýÈç¼ÙÉèÄãÓÐÒ»¸öWriterỊ̈߳¬ËüÖ»»áÏòMapÖвåÈëÒѾ­´æÔÚµÄÊý¾Ý£¬Ò»¸öReaderỊ̈߳¬Ëü»á´ÓMapÖжÁÈ¡Êý¾Ý£¬ÄÇôËüΪʲô²»¹¤×÷ÄØ£¿

ÒòΪÔÚ×Ô¶¯µ÷Õû´óСµÄ»úÖÆÏ£¬Èç¹ûÏß³ÌÊÔ×ÅÈ¥Ìí¼Ó»òÕß»ñȡһ¸ö¶ÔÏó£¬Map¿ÉÄÜ»áʹÓþɵÄË÷ÒýÖµ£¬ÕâÑù¾Í²»»áÕÒµ½Entry¶ÔÏóËùÔÚµÄÐÂͰ¡£

ÔÚ×îÔã¸âµÄÇé¿öÏ£¬µ±2¸öÏß³Ìͬʱ²åÈëÊý¾Ý£¬¶ø2´Îput()µ÷Óûáͬʱ³ö·¢Êý×é×Ô¶¯µ÷Õû´óС¡£¼ÈÈ»Á½¸öÏß³ÌÔÚͬʱÐÞ¸ÄÁ´±í£¬ÄÇôMapÓпÉÄÜÔÚÒ»¸öÁ´±íµÄÄÚ²¿Ñ­»·ÖÐÍ˳ö¡£Èç¹ûÄãÊÔ×ÅÈ¥»ñȡһ¸ö´øÓÐÄÚ²¿Ñ­»·µÄÁбíÖеÄÊý¾Ý£¬ÄÇôget()·½·¨ÓÀÔ¶²»»á½áÊø¡£

HashTableÌṩÁËÒ»¸öḬ̈߳²È«µÄʵÏÖ£¬¿ÉÒÔ×èÖ¹ÉÏÊöÇé¿ö·¢Éú¡£µ«ÊÇ£¬¼ÈÈ»ËùÓеÄͬ²½µÄCRUD²Ù×÷¶¼·Ç³£Âý¡£ÀýÈ磬Èç¹ûÏß³Ì1µ÷Óà get(key1)£¬È»ºóÏß³Ì2µ÷ÓÃget(key2)£¬Ïß³Ì2µ÷ÓÃget(key3)£¬ÄÇôÔÚÖ¸¶¨Ê±¼ä£¬Ö»ÄÜÓÐ1¸öÏ߳̿ÉÒԵõ½ËüµÄÖµ£¬µ«ÊÇ3¸öÏ̶߳¼ ¿ÉÒÔͬʱ·ÃÎÊÕâЩÊý¾Ý¡£

´ÓJava 5¿ªÊ¼£¬ÎÒÃǾÍÓµÓÐÒ»¸ö¸üºÃµÄ¡¢±£Ö¤Ḭ̈߳²È«µÄHashMapʵÏÖ£ºConcurrentHashMap¡£¶ÔÓÚConcurrentMapÀ´Ëµ£¬Ö»ÓÐͰÊÇ Í¬²½µÄ£¬ÕâÑùÈç¹û¶à¸öÏ̲߳»Ê¹ÓÃͬһ¸öͰ»òÕßµ÷ÕûÄÚ²¿Êý×éµÄ´óС£¬ËüÃÇ¿ÉÒÔͬʱµ÷ÓÃget()¡¢remove()»òÕßput()·½·¨¡£ÔÚÒ»¸ö¶àÏß³ÌÓ¦ÓÃ³Ì ÐòÖУ¬ÕâÖÖ·½Ê½ÊǸüºÃµÄÑ¡Ôñ¡£

¼üµÄ²»±äÐÔ

Ϊʲô½«×Ö·û´®ºÍÕûÊý×÷ΪHashMapµÄ¼üÊÇÒ»ÖֺܺõÄʵÏÖ£¿Ö÷ÒªÊÇÒòΪËüÃÇÊDz»¿É±äµÄ£¡Èç¹ûÄãÑ¡Ôñ×Ô¼º´´½¨Ò»¸öÀà×÷Ϊ¼ü£¬µ«²»Äܱ£Ö¤Õâ¸öÀàÊDz»¿É±äµÄ£¬ÄÇôÄã¿ÉÄÜ»áÔÚHashMapÄÚ²¿¶ªÊ§Êý¾Ý¡£

ÎÒÃÇÀ´¿´ÏÂÃæµÄÓÃÀý£º

ÄãÓÐÒ»¸ö¼ü£¬ËüµÄÄÚ²¿ÖµÊÇ¡°1¡±¡£

ÄãÏòHashMapÖвåÈëÒ»¸ö¶ÔÏó£¬ËüµÄ¼ü¾ÍÊÇ¡°1¡±¡£

HashMap´Ó¼ü£¨¼´¡°1¡±£©µÄÉ¢ÁÐÂëÖÐÉú³É¹þÏ£Öµ¡£

MapÔÚд´½¨µÄ¼Ç¼Öд洢Õâ¸ö¹þÏ£Öµ¡£

Äã¸Ä¶¯¼üµÄÄÚ²¿Öµ£¬½«Æä±äΪ¡°2¡±¡£

¼üµÄ¹þÏ£Öµ·¢ÉúÁ˸ı䣬µ«ÊÇHashMap²¢²»ÖªµÀÕâÒ»µã£¨ÒòΪ´æ´¢µÄÊǾɵĹþÏ£Öµ£©¡£

ÄãÊÔ×Åͨ¹ýÐ޸ĺóµÄ¼ü»ñÈ¡ÏàÓ¦µÄ¶ÔÏó¡£

Map»á¼ÆËãеļü£¨¼´¡°2¡±£©µÄ¹þÏ£Öµ£¬´Ó¶øÕÒµ½Entry¶ÔÏóËùÔÚµÄÁ´±í£¨Í°£©¡£

Çé¿ö1£º ¼ÈÈ»ÄãÒѾ­ÐÞ¸ÄÁ˼ü£¬Map»áÊÔ×ÅÔÚ´íÎóµÄͰÖÐѰÕÒEntry¶ÔÏó£¬Ã»ÓÐÕÒµ½¡£

Çé¿ö2£º ÄãºÜÐÒÔË£¬Ð޸ĺóµÄ¼üÉú³ÉµÄͰºÍ¾É¼üÉú³ÉµÄͰÊÇͬһ¸ö¡£MapÕâʱ»áÔÚÁ´±íÖнøÐбéÀú£¬ÒÑÕÒµ½¾ßÓÐÏàͬ¼üµÄEntry¶ÔÏó¡£µ«ÊÇΪÁËѰÕÒ¼ü£¬MapÊ×ÏÈ»á ͨ¹ýµ÷ÓÃequals()·½·¨À´±È½Ï¼üµÄ¹þÏ£Öµ¡£ÒòΪÐ޸ĺóµÄ¼ü»áÉú³É²»Í¬µÄ¹þÏ£Öµ£¨¾ÉµÄ¹þÏ£Öµ±»´æ´¢ÔڼǼÖУ©£¬ÄÇôMapûÓа취ÔÚÁ´±íÖÐÕÒµ½¶ÔÓ¦µÄ Entry¶ÔÏó¡£

ÏÂÃæÊÇÒ»¸öJavaʾÀý£¬ÎÒÃÇÏòMapÖвåÈëÁ½¸ö¼üÖµ¶Ô£¬È»ºóÎÒÐ޸ĵÚÒ»¸ö¼ü£¬²¢ÊÔ×ÅÈ¥»ñÈ¡ÕâÁ½¸ö¶ÔÏó¡£Äã»á·¢ÏÖ´ÓMapÖзµ»ØµÄÖ»Óеڶþ¸ö¶ÔÏ󣬵ÚÒ»¸ö¶ÔÏóÒѾ­¡°¶ªÊ§¡±ÔÚHashMapÖУº

public class MutableKeyTest { 

public static void main(String[] args) {

class MyKey {
Integer i;

public void setI(Integer i) {
this.i = i;
}

public MyKey(Integer i) {
this.i = i;
}

@Override
public int hashCode() {
return i;
}

@Override
public boolean equals(Object obj) {
if (obj instanceof MyKey) {
return i.equals(((MyKey) obj).i);
} else
return false;
}

}

Map<MyKey, String> myMap = new HashMap<>();
MyKey key1 = new MyKey(1);
MyKey key2 = new MyKey(2);

myMap.put(key1, "test " + 1);
myMap.put(key2, "test " + 2);

// modifying key1
key1.setI(3);

String test1 = myMap.get(key1);
String test2 = myMap.get(key2);

System.out.println("test1= " + test1 + " test2=" + test2);

}

}

ÉÏÊö´úÂëµÄÊä³öÊÇ¡°test1=null test2=test 2¡±¡£ÈçÎÒÃÇÆÚÍûµÄÄÇÑù£¬MapûÓÐÄÜÁ¦»ñÈ¡¾­¹ýÐ޸ĵļü 1Ëù¶ÔÓ¦µÄ×Ö·û´®1¡£

Java 8 ÖеĸĽø

ÔÚJava 8ÖУ¬HashMapÖеÄÄÚ²¿ÊµÏÖ½øÐÐÁ˺ܶàÐ޸ġ£µÄÈ·Èç´Ë£¬Java 7ʹÓÃÁË1000ÐдúÂëÀ´ÊµÏÖ£¬¶øJava 8ÖÐʹÓÃÁË2000ÐдúÂë¡£ÎÒÔÚÇ°ÃæÃèÊöµÄ´ó²¿·ÖÄÚÈÝÔÚJava 8ÖÐÒÀÈ»ÊǶԵ쬳ýÁËʹÓÃÁ´±íÀ´±£´æEntry¶ÔÏó¡£ÔÚJava 8ÖУ¬ÎÒÃÇÈÔȻʹÓÃÊý×飬µ«Ëü»á±»±£´æÔÚNodeÖУ¬NodeÖаüº¬Á˺Í֮ǰEntry¶ÔÏóÒ»ÑùµÄÐÅÏ¢£¬²¢ÇÒÒ²»áʹÓÃÁ´±í£º

ÏÂÃæÊÇÔÚJava 8ÖÐNodeʵÏÖµÄÒ»²¿·Ö´úÂ룺

static class Node<K,V> implements Map.Entry<K,V> { 
final int hash;
final K key;
V value;
Node<K,V> next;

ÄÇôºÍJava 7Ïà±È£¬µ½µ×ÓÐʲô´óµÄÇø±ðÄØ£¿ºÃ°É£¬Node¿ÉÒÔ±»À©Õ¹³ÉTreeNode¡£TreeNodeÊÇÒ»¸öºìºÚÊ÷µÄÊý¾Ý½á¹¹£¬Ëü¿ÉÒÔ´æ´¢¸ü¶àµÄÐÅÏ¢£¬ÕâÑùÎÒÃÇ ¿ÉÒÔÔÚO(log(n))µÄ¸´ÔÓ¶ÈÏÂÌí¼Ó¡¢É¾³ý»òÕß»ñȡһ¸öÔªËØ¡£ÏÂÃæµÄʾÀýÃèÊöÁËTreeNode±£´æµÄËùÓÐÐÅÏ¢£º

static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { 
final int hash; // inherited from Node<K,V>
final K key; // inherited from Node<K,V>
V value; // inherited from Node<K,V>
Node<K,V> next; // inherited from Node<K,V>
Entry<K,V> before, after;// inherited from LinkedHashMap.Entry<K,V>
TreeNode<K,V> parent;
TreeNode<K,V> left;
TreeNode<K,V> right;
TreeNode<K,V> prev;
boolean red;

ºìºÚÊ÷ÊÇ×ÔÆ½ºâµÄ¶þ²æËÑË÷Ê÷¡£ËüµÄÄÚ²¿»úÖÆ¿ÉÒÔ±£Ö¤ËüµÄ³¤¶È×ÜÊÇlog(n)£¬²»¹ÜÎÒÃÇÊÇÌí¼Ó»¹ÊÇɾ³ý½Úµã¡£Ê¹ÓÃÕâÖÖÀàÐ͵ÄÊ÷£¬×îÖ÷ÒªµÄºÃ´¦ÊÇÕë¶Ô ÄÚ²¿±íÖÐÐí¶àÊý¾Ý¶¼¾ßÓÐÏàͬË÷Òý£¨Í°£©µÄÇé¿ö£¬Õâʱ¶ÔÊ÷½øÐÐËÑË÷µÄ¸´ÔÓ¶ÈÊÇO(log(n))£¬¶ø¶ÔÓÚÁ´±íÀ´Ëµ£¬Ö´ÐÐÏàͬµÄ²Ù×÷£¬¸´ÔÓ¶ÈÊÇO(n)¡£

ÈçÄãËù¼û£¬ÎÒÃÇÔÚÊ÷ÖÐȷʵ´æ´¢Á˱ÈÁ´±í¸ü¶àµÄÊý¾Ý¡£¸ù¾Ý¼Ì³ÐÔ­Ôò£¬ÄÚ²¿±íÖпÉÒÔ°üº¬Node£¨Á´±í£©»òÕßTreeNode£¨ºìºÚÊ÷£©¡£Oracle¾ö¶¨¸ù¾ÝÏÂÃæµÄ¹æÔòÀ´Ê¹ÓÃÕâÁ½ÖÖÊý¾Ý½á¹¹£º

- ¶ÔÓÚÄÚ²¿±íÖеÄÖ¸¶¨Ë÷Òý£¨Í°£©£¬Èç¹ûnodeµÄÊýÄ¿¶àÓÚ8¸ö£¬ÄÇôÁ´±í¾Í»á±»×ª»»³ÉºìºÚÊ÷¡£

- ¶ÔÓÚÄÚ²¿±íÖеÄÖ¸¶¨Ë÷Òý£¨Í°£©£¬Èç¹ûnodeµÄÊýĿСÓÚ6¸ö£¬ÄÇôºìºÚÊ÷¾Í»á±»×ª»»³ÉÁ´±í¡£

ÕâÕÅͼƬÃèÊöÁËÔÚJava 8 HashMapÖеÄÄÚ²¿Êý×飬Ëü¼È°üº¬Ê÷£¨Í°0£©£¬Ò²°üº¬Á´±í£¨Í°1£¬2ºÍ3£©¡£Í°0ÊÇÒ»¸öÊ÷½á¹¹ÊÇÒòΪËü°üº¬µÄ½Úµã´óÓÚ8¸ö¡£

Äڴ濪Ïú

JAVA 7

ʹÓÃHashMap»áÏûºÄһЩÄÚ´æ¡£ÔÚJava 7ÖУ¬HashMap½«¼üÖµ¶Ô·â×°³ÉEntry¶ÔÏó£¬Ò»¸öEntry¶ÔÏó°üº¬ÒÔÏÂÐÅÏ¢£º

Ö¸ÏòÏÂÒ»¸ö¼Ç¼µÄÒýÓÃ

Ò»¸öÔ¤ÏȼÆËãµÄ¹þÏ£Öµ£¨ÕûÊý£©

Ò»¸öÖ¸Ïò¼üµÄÒýÓÃ

Ò»¸öÖ¸ÏòÖµµÄÒýÓÃ

´ËÍ⣬Java 7ÖеÄHashMapʹÓÃÁËEntry¶ÔÏóµÄÄÚ²¿Êý×é¡£¼ÙÉèÒ»¸öJava 7 HashMap°üº¬N¸öÔªËØ£¬ËüµÄÄÚ²¿Êý×éµÄÈÝÁ¿ÊÇCAPACITY£¬ÄÇô¶îÍâµÄÄÚ´æÏûºÄ´óÔ¼ÊÇ£º

sizeOf(integer)* N + sizeOf(reference)* (3*N+C)

ÆäÖУº

ÕûÊýµÄ´óСÊÇ4¸ö×Ö½Ú

ÒýÓõĴóСÒÀÀµÓÚJVM¡¢²Ù×÷ϵͳÒÔ¼°´¦ÀíÆ÷£¬µ«Í¨³£¶¼ÊÇ4¸ö×Ö½Ú¡£

Õâ¾ÍÒâζ×ÅÄÚ´æ×Ü¿ªÏúͨ³£ÊÇ16 * N + 4 * CAPACITY×Ö½Ú¡£

×¢Ò⣺ÔÚMap×Ô¶¯µ÷Õû´óСºó£¬CAPACITYµÄÖµÊÇÏÂÒ»¸ö´óÓÚNµÄ×îСµÄ2µÄÃÝÖµ¡£

×¢Ò⣺´ÓJava 7¿ªÊ¼£¬HashMap²ÉÓÃÁËÑÓ³Ù¼ÓÔØµÄ»úÖÆ¡£ÕâÒâζ׿´Ê¹ÄãΪHashMapÖ¸¶¨ÁË´óС£¬ÔÚÎÒÃǵÚÒ»´ÎʹÓÃput()·½·¨Ö®Ç°£¬¼Ç¼ʹÓõÄÄÚ²¿Êý×飨ºÄ·Ñ4*CAPACITY×Ö½Ú£©Ò²²»»áÔÚÄÚ´æÖзÖÅä¿Õ¼ä¡£

JAVA 8

ÔÚJava 8ʵÏÖÖУ¬¼ÆËãÄÚ´æÊ¹ÓÃÇé¿ö±äµÃ¸´ÔÓһЩ£¬ÒòΪNode¿ÉÄÜ»áºÍEntry´æ´¢ÏàͬµÄÊý¾Ý£¬»òÕßÔÚ´Ë»ù´¡ÉÏÔÙÔö¼Ó6¸öÒýÓúÍÒ»¸öBooleanÊôÐÔ£¨Ö¸¶¨ÊÇ·ñÊÇTreeNode£©¡£

Èç¹ûËùÓеĽڵ㶼ֻÊÇNode£¬ÄÇôJava 8 HashMapÏûºÄµÄÄÚ´æºÍJava 7 HashMapÏûºÄµÄÄÚ´æÊÇÒ»ÑùµÄ¡£

Èç¹ûËùÓеĽڵ㶼ÊÇTreeNode£¬ÄÇôJava 8 HashMapÏûºÄµÄÄÚ´æ¾Í±ä³É£º

N * sizeOf(integer) + N * sizeOf(boolean) + sizeOf(reference)*  (9*N+CAPACITY )

Ôڴ󲿷ֱê×¼JVMÖУ¬ÉÏÊö¹«Ê½µÄ½á¹ûÊÇ44 * N + 4 * CAPACITY ×Ö½Ú¡£

ÐÔÄÜÎÊÌâ

·Ç¶Ô³ÆHashMap vs ¾ùºâHashMap

ÔÚ×îºÃµÄÇé¿öÏ£¬get()ºÍput()·½·¨¶¼Ö»ÓÐO(1)µÄ¸´ÔÓ¶È¡£µ«ÊÇ£¬Èç¹ûÄ㲻ȥ¹ØÐļüµÄ¹þÏ£º¯Êý£¬ÄÇôÄãµÄput()ºÍget()·½·¨¿ÉÄÜ »áÖ´Ðзdz£Âý¡£put()ºÍget()·½·¨µÄ¸ßЧִÐУ¬È¡¾öÓÚÊý¾Ý±»·ÖÅäµ½ÄÚ²¿Êý×飨Ͱ£©µÄ²»Í¬µÄË÷ÒýÉÏ¡£Èç¹û¼üµÄ¹þÏ£º¯ÊýÉè¼Æ²»ºÏÀí£¬Äã»áµÃµ½Ò»¸ö·Ç¶Ô ³ÆµÄ·ÖÇø£¨²»¹ÜÄÚ²¿Êý¾ÝµÄÊǶà´ó£©¡£ËùÓеÄput()ºÍget()·½·¨»áʹÓÃ×î´óµÄÁ´±í£¬ÕâÑù¾Í»áÖ´ÐкÜÂý£¬ÒòΪËüÐèÒªµü´úÁ´±íÖеÄÈ«²¿¼Ç¼¡£ÔÚ×µÄÇé ¿öÏ£¨Èç¹û´ó²¿·ÖÊý¾Ý¶¼ÔÚͬһ¸öͰÉÏ£©£¬ÄÇôÄãµÄʱ¼ä¸´ÔӶȾͻá±äΪO(n)¡£

ÏÂÃæÊÇÒ»¸ö¿ÉÊÓ»¯µÄʾÀý¡£µÚÒ»ÕÅͼÃèÊöÁËÒ»¸ö·Ç¶Ô³ÆHashMap£¬µÚ¶þÕÅͼÃèÊöÁËÒ»¸ö¾ùºâHashMap¡£

ÔÚÕâ¸ö·Ç¶Ô³ÆHashMapÖУ¬ÔÚͰ0ÉÏÔËÐÐget()ºÍput()·½·¨»áºÜ»¨·Ñʱ¼ä¡£»ñÈ¡¼Ç¼KÐèÒª»¨·Ñ6´Îµü´ú¡£

ÔÚÕâ¸ö¾ùºâHashMapÖУ¬»ñÈ¡¼Ç¼KÖ»ÐèÒª»¨·Ñ3´Îµü´ú¡£ÕâÁ½¸öHashMap´æ´¢ÁËÏàͬÊýÁ¿µÄÊý¾Ý£¬²¢ÇÒÄÚ²¿Êý×éµÄ´óСһÑù¡£Î¨Ò»µÄÇø±ðÊǼüµÄ¹þÏ£º¯Êý£¬Õâ¸öº¯ÊýÓÃÀ´½«¼Ç¼·Ö²¼µ½²»Í¬µÄͰÉÏ¡£

ÏÂÃæÊÇÒ»¸öʹÓÃJava±àдµÄ¼«¶ËʾÀý£¬ÔÚÕâ¸öʾÀýÖУ¬ÎÒʹÓùþÏ£º¯Êý½«ËùÓеÄÊý¾Ý·Åµ½ÏàͬµÄÁ´±í£¨Í°£©£¬È»ºóÎÒÌí¼ÓÁË2,000,000ÌõÊý¾Ý¡£

public class Test { 

public static void main(String[] args) {

class MyKey {
Integer i;
public MyKey(Integer i){
this.i =i;
}

@Override
public int hashCode() {
return 1;
}

@Override
public boolean equals(Object obj) {
¡­
}

}
Date begin = new Date();
Map <MyKey,String> myMap= new HashMap<>(2_500_000,1);
for (int i=0;i<2_000_000;i++){
myMap.put( new MyKey(i), "test "+i);
}

Date end = new Date();
System.out.println("Duration (ms) "+ (end.getTime()-begin.getTime()));
}
}

ÎҵĻúÆ÷ÅäÖÃÊÇcore i5-2500k @ 3.6G£¬ÔÚjava 8u40ÏÂÐèÒª»¨·Ñ³¬¹ý45·ÖÖÓµÄʱ¼äÀ´ÔËÐУ¨ÎÒÔÚ45·ÖÖÓºóÍ£Ö¹Á˽ø³Ì£©¡£Èç¹ûÎÒÔËÐÐͬÑùµÄ´úÂ룬 µ«ÊÇÎÒʹÓÃÈçϵÄhashº¯Êý£º

 @Override 
public int hashCode() {
int key = 2097152-1;
return key+2097152*i;
}

ÔËÐÐËüÐèÒª»¨·Ñ46Ã룬ºÍ֮ǰ±È£¬ÕâÖÖ·½Ê½ºÃºÜ¶àÁË£¡ÐµÄhashº¯Êý±È¾ÉµÄhashº¯ÊýÔÚ´¦Àí¹þÏ£·ÖÇøÊ±¸üºÏÀí£¬Òò´Ëµ÷ÓÃput()·½·¨»á¸ü¿ìһЩ¡£Èç¹ûÄãÏÖÔÚÔËÐÐÏàͬµÄ´úÂ룬µ«ÊÇʹÓÃÏÂÃæµÄhashº¯Êý£¬ËüÌṩÁ˸üºÃµÄ¹þÏ£·ÖÇø£º

@Override 
public int hashCode() {
return i;
}

ÏÖÔÚÖ»ÐèÒª»¨·Ñ2Ã룡

ÎÒÏ£ÍûÄãÄܹ»Òâʶµ½¹þÏ£º¯ÊýÓжàÖØÒª¡£Èç¹ûÔÚJava 7ÉÏÃæÔËÐÐͬÑùµÄ²âÊÔ£¬µÚÒ»¸öºÍµÚ¶þ¸öµÄÇé¿ö»á¸üÔ㣨ÒòΪJava 7ÖеÄput()·½·¨¸´ÔÓ¶ÈÊÇO(n)£¬¶øJava 8Öеĸ´ÔÓ¶ÈÊÇO(log(n))¡£

ÔÚʹÓÃHashMapʱ£¬ÄãÐèÒªÕë¶Ô¼üÕÒµ½Ò»ÖÖ¹þÏ£º¯Êý£¬¿ÉÒÔ½«¼üÀ©É¢µ½×î¿ÉÄܵÄͰÉÏ¡£Îª´Ë£¬ÄãÐèÒª±ÜÃâ¹þÏ£³åÍ»¡£String¶ÔÏóÊÇÒ»¸ö·Ç³£ºÃµÄ¼ü£¬ÒòΪËüÓкܺõĹþÏ£º¯Êý¡£IntegerÒ²ºÜºÃ£¬ÒòΪËüµÄ¹þÏ£Öµ¾ÍÊÇËü×ÔÉíµÄÖµ¡£

µ÷Õû´óСµÄ¿ªÏú

Èç¹ûÄãÐèÒª´æ´¢´óÁ¿Êý¾Ý£¬ÄãÓ¦¸ÃÔÚ´´½¨HashMapʱָ¶¨Ò»¸ö³õʼµÄÈÝÁ¿£¬Õâ¸öÈÝÁ¿Ó¦¸Ã½Ó½üÄãÆÚÍûµÄ´óС¡£

Èç¹ûÄã²»ÕâÑù×ö£¬Map»áʹÓÃĬÈϵĴóС£¬¼´16£¬factorLoadµÄÖµÊÇ0.75¡£Ç°11´Îµ÷ÓÃput()·½·¨»á·Ç³£¿ì£¬µ«ÊǵÚ12´Î £¨16*0.75£©µ÷ÓÃʱ»á´´½¨Ò»¸öеij¤¶ÈΪ32µÄÄÚ²¿Êý×飨ÒÔ¼°¶ÔÓ¦µÄÁ´±í/Ê÷£©£¬µÚ13´Îµ½µÚ22´Îµ÷ÓÃput()·½·¨»áºÜ¿ì£¬µ«ÊǵÚ23´Î £¨32*0.75£©µ÷ÓÃʱ»áÖØÐ´´½¨£¨ÔÙÒ»´Î£©Ò»¸öеÄÄÚ²¿Êý×飬Êý×éµÄ³¤¶È·­±¶¡£È»ºóÄÚ²¿µ÷Õû´óСµÄ²Ù×÷»áÔÚµÚ48´Î¡¢96´Î¡¢192´Î¡­..µ÷Óà put()·½·¨Ê±´¥·¢¡£Èç¹ûÊý¾ÝÁ¿²»´ó£¬Öؽ¨ÄÚ²¿Êý×éµÄ²Ù×÷»áºÜ¿ì£¬µ«ÊÇÊý¾ÝÁ¿ºÜ´óʱ£¬»¨·ÑµÄʱ¼ä¿ÉÄÜ»á´ÓÃë¼¶µ½·ÖÖÓ¼¶¡£Í¨¹ý³õʼ»¯Ê±Ö¸¶¨MapÆÚÍûµÄ´ó С£¬Äã¿ÉÒÔ±ÜÃâµ÷Õû´óС²Ù×÷´øÀ´µÄÏûºÄ¡£

µ«ÕâÀïÒ²ÓÐÒ»¸öȱµã£ºÈç¹ûÄ㽫Êý×éÉèÖõķdz£´ó£¬ÀýÈç2^28£¬µ«ÄãÖ»ÊÇÓÃÁËÊý×éÖеÄ2^26¸öͰ£¬ÄÇôÄ㽫»áÀË·Ñ´óÁ¿µÄÄڴ棨ÔÚÕâ¸öʾÀýÖдóÔ¼ÊÇ2^30×Ö½Ú£©¡£

½áÂÛ

¶ÔÓÚ¼òµ¥µÄÓÃÀý£¬ÄãûÓбØÒªÖªµÀHashMapÊÇÈçºÎ¹¤×÷µÄ£¬ÒòΪÄã²»»á¿´µ½O(1)¡¢O(n)ÒÔ¼°O(log(n))Ö®¼äµÄÇø±ð¡£µ«ÊÇÈç¹ûÄܹ»Àí½âÕâÒ»¾­³£Ê¹ÓõÄÊý¾Ý½á¹¹±³ºóµÄ»úÖÆ£¬×ÜÊÇÓкô¦µÄ¡£ÁíÍ⣬¶ÔÓÚJava¿ª·¢ÕßְλÀ´Ëµ£¬ÕâÊÇÒ»µÀµäÐ͵ÄÃæÊÔÎÊÌâ¡£

¶ÔÓÚ´óÊý¾ÝÁ¿µÄÇé¿ö£¬Á˽âHashMapÈçºÎ¹¤×÷ÒÔ¼°Àí½â¼üµÄ¹þÏ£º¯ÊýµÄÖØÒªÐԾͱäµÃ·Ç³£ÖØÒª¡£

ÎÒÏ£ÍûÕâÆªÎÄÕ¿ÉÒÔ°ïÖúÄã¶ÔHashMapµÄʵÏÖÓÐÒ»¸öÉîÈëµÄÀí½â¡£

   
2002 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ