锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人精品日本亚洲专区61 ,日韩亚洲人成在线综合,亚洲日韩中文字幕一区http://m.tkk7.com/dongbule/category/47488.html寤洪犻珮鎬ц兘闂ㄦ埛緗?/description>zh-cnWed, 15 Jun 2011 12:18:22 GMTWed, 15 Jun 2011 12:18:22 GMT60java鏁版嵁緇撴瀯-Comparable&Comparatorhttp://m.tkk7.com/dongbule/archive/2011/06/15/352361.html闄堜簬鍠?/dc:creator>闄堜簬鍠?/author>Wed, 15 Jun 2011 07:07:00 GMThttp://m.tkk7.com/dongbule/archive/2011/06/15/352361.htmlhttp://m.tkk7.com/dongbule/comments/352361.htmlhttp://m.tkk7.com/dongbule/archive/2011/06/15/352361.html#Feedback0http://m.tkk7.com/dongbule/comments/commentRss/352361.htmlhttp://m.tkk7.com/dongbule/services/trackbacks/352361.html鍦ㄦ繁鍏ヤ簡瑙reeMap涔嬪墠錛屾湁涓や釜鎺ュ彛瑕佸厛寮勬竻妤氾紝鍒嗗埆鏄疌omparable鍜孋omparator

Comparable & Comparator

Comparable
Comparable 姝ゆ帴鍙e己琛屽瀹炵幇瀹冪殑姣忎釜綾葷殑瀵硅薄榪涜鏁翠綋鎺掑簭銆傝繖縐嶆帓搴忚縐頒負綾葷殑鑷劧鎺掑簭錛岀被鐨?compareTo 鏂規硶琚О涓哄畠鐨勮嚜鐒舵瘮杈冩柟娉曘傚璞℃湰韜氨宸茬粡鏀寔鑷瘮杈冩墍闇瑕佸疄鐜扮殑鎺ュ彛錛堝 String銆両nteger 鑷繁灝卞彲浠ュ畬鎴愭瘮杈冨ぇ灝忔搷浣滐級銆?br />
瀹冨彧鏈変竴涓柟娉?int compareTo(T o),鐢ㄦ潵姣旇緝褰撳墠瀵硅薄鍜屼紶鍏ョ殑鍙傛暟錛屾煡鐪媕dk api錛屽叡鏈夎繖涓鎵圭被瀹炵幇浜嗘鎺ュ彛錛岃涓嬪浘


鎵撳紑瀹炵幇浜嗚鎺ュ彛鐨処nteger鍖呰綾繪煡鐪嬫簮鐮?/div>
public final class Integer extends Number implements Comparable<Integer> {

    
public int compareTo(Integer anotherInteger) {
    
int thisVal = this.value;
    
int anotherVal = anotherInteger.value;
    
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
    }

鍙互鐪嬪埌璇ユ柟娉曢氳繃褰撳墠鐨処nteger瀵硅薄鐨勫兼槸鍚﹀ぇ浜庝紶鍏ョ殑鍙傛暟鏉ュ緱鍒拌繑鍥炲鹼紝Integer鐨刢ompareTo瀹炵幇鏄寜鏁板瓧澶у皬鐨勮嚜鐒舵帓搴忥紝鍐嶆壘鍙︿竴涓緥瀛怱tring

public final class String
    
implements java.io.Serializable, Comparable<String>, CharSequence
{
public int compareTo(String anotherString) {
    
int len1 = count;
    
int len2 = anotherString.count;
    
int n = Math.min(len1, len2);
    
char v1[] = value;
    
char v2[] = anotherString.value;
    
int i = offset;
    
int j = anotherString.offset;

    
if (i == j) {
        
int k = i;
        
int lim = n + i;
        
while (k < lim) {
        
char c1 = v1[k];
        
char c2 = v2[k];
        
if (c1 != c2) {
            
return c1 - c2;
        }
        k
++;
        }
    } 
else {
        
while (n-- != 0) {
        
char c1 = v1[i++];
        
char c2 = v2[j++];
        
if (c1 != c2) {
            
return c1 - c2;
        }
        }
    }
    
return len1 - len2;
    }

鍙互鐪嬪嚭String鐨刢ompareTo瀹炵幇鏄寜瀛楃涓蹭腑瀛楃鐨刄nicode鍊艱繘琛屾帓搴忕殑錛屼篃鐪熸槸鍥犱負鍚勭綾誨疄鐜扮殑涓嶅悓錛屾墍浠ュ彧鏈夊湪鐩鎬簰鍙瘮鐨勭被鎵嶈兘榪涜鎺掑簭錛屽惁鍒欎細鎶涘嚭java.lang.ClassCastException鐨勫紓甯搞傚簲璇ヨComparable鏄泦鍚堝唴閮ㄥ疄鐜扮殑鎺掑簭錛屾兂瑕佽繘琛岄泦鍚堝鐨勬帓搴忓氨闇瑕丆omparator鎺ュ彛銆?br />
Comparator
濡傛灉涓涓被涓嶈兘瀹炵幇Comparable鎺ュ彛錛岄偅涔堟垜浠嚜宸卞彲浠ユ彁渚汣omparator鐨勬帓搴忥紝濡傛灉浣犱笉鍠滄緙虹渷鐨凜omparator琛屼負錛岀収鏍峰彲浠ョ紪鍐欒嚜宸辯殑Comparator銆?br />
Comparator鍙湁2涓柟娉曪紝鍒嗗埆涓篿nt compare(T o1, T o2) 鍜宐oolean equals(Object obj)

Comparator鐨刢ompare鏂規硶鐨勮繑鍥炲煎拰Comparable鐨刢ompareTo榪斿洖鍊煎熀鏈浉浼鹼紝濡傛灉鎺掑簭絎竴涓厓绱犲嚭鐜板湪絎簩涓厓绱犱箣鍓嶏紝鍒欒繑鍥炰竴涓礋鍊鹼紝濡傛灉絎竴涓厓绱犲嚭鐜板湪絎簩涓厓绱犲悗闈紝榪斿洖涓涓鍊鹼紝鍐嶅惁鍒欙紝榪斿洖闆躲備笌Comparable涓嶅悓鐨勬槸Comparator鏄敱鐢ㄦ埛鑷鍐沖畾澶勭悊銆?br /> 閫氳繃涓涓皬渚嬪瓙鍙互姣旇緝鏄庣‘鐨勭湅鍑?/div>
      class ComparatorTest implements Comparator{
          
public int compare(Object u1, Object u2) {
            String uname1 
= ((User)u1).getName();
            String uname2 
= ((User)u2).getName();
            
return uname1.compareTo(uname2);
        }
      }
      
class User {
          
private String name;
          
public String getName(){
              
return this.name;
          }
      }

Comparator姣旇緝鍑芥暟寮鴻瀵規煇浜涘璞?collection 榪涜鏁翠綋鎺掑簭銆傚彲浠ュ皢 Comparator 浼犻掔粰 sort 鏂規硶錛堝 Collections.sort錛夛紝浠庤屽厑璁稿湪鎺掑簭欏哄簭涓婂疄鐜扮簿紜帶鍒躲傝繕鍙互浣跨敤 Comparator 鏉ユ帶鍒舵煇浜涙暟鎹粨鏋勶紙濡?TreeSet 鎴?TreeMap錛夌殑欏哄簭銆?/div>

]]>java鏁版嵁緇撴瀯-HashMaphttp://m.tkk7.com/dongbule/archive/2011/02/15/344387.html闄堜簬鍠?/dc:creator>闄堜簬鍠?/author>Tue, 15 Feb 2011 11:18:00 GMThttp://m.tkk7.com/dongbule/archive/2011/02/15/344387.htmlhttp://m.tkk7.com/dongbule/comments/344387.htmlhttp://m.tkk7.com/dongbule/archive/2011/02/15/344387.html#Feedback6http://m.tkk7.com/dongbule/comments/commentRss/344387.htmlhttp://m.tkk7.com/dongbule/services/trackbacks/344387.html
涓嬮潰浠ashMap涓轟緥瀛愶紝娣卞叆瀵筂ap鐨勫疄鐜版満鍒惰繘琛屼簡瑙o紝鍦ㄨ繖涓繃紼嬩腑錛岃鎵撳紑jdk婧愮爜銆?br />
Hash綆楁硶

HashMap浣跨敤Hash綆楁硶錛屾墍浠ュ湪瑙e墫HashMap涔嬮棿錛岄渶瑕佸厛綆鍗曠殑浜嗚ВHash綆楁硶錛孒ash綆楁硶涓鑸篃鎴愪負鏁e垪綆楁硶錛岄氳繃鏁e垪綆楁硶灝嗕換鎰忕殑鍊艱漿鍖栨垚鍥哄畾鐨勯暱搴﹁緭鍑猴紝璇ヨ緭鍑哄氨鏄暎鍒楀鹼紝榪欐槸涓縐嶅帇緙╂槧灝勶紝涔熷氨鏄紝鏁e垪鍊肩殑絀洪棿榪滆繙灝忎簬杈撳叆鐨勫肩┖闂淬?br /> 綆鍗曠殑璇達紝hash綆楁硶鐨勬剰涔夊湪浜庢彁渚涗簡涓縐嶅揩閫熷瓨鍙栨暟鎹殑鏂規硶,瀹冪敤涓縐嶇畻娉曞緩绔嬮敭鍊間笌鐪熷疄鍊間箣闂寸殑瀵瑰簲鍏崇郴,(姣忎竴涓湡瀹炲煎彧鑳芥湁涓涓敭鍊?浣嗘槸涓涓敭鍊煎彲浠ュ搴斿涓湡瀹炲?,榪欐牱鍙互蹇熷湪鏁扮粍絳夐噷闈㈠瓨鍙栨暟鎹?br />
涓嬮潰鎴戜滑寤虹珛涓涓狧ashMap,鐒跺悗寰閲岄潰鏀懼叆12瀵筴ey-value錛岃繖涓狧ashMap鐨勯粯璁ゆ暟緇勯暱搴︿負16錛屾垜浠殑key鍒嗗埆瀛樻斁鍦ㄨ鏁扮粍鐨勬牸瀛愪腑錛屾瘡涓牸瀛愪笅闈㈠瓨鏀劇殑鍏冪礌鍙堟槸浠ラ摼琛ㄧ殑鏂瑰紡瀛樻斁鍏冪礌銆?br />
    public static void main(String[] args) {
        Map map 
= new HashMap();
        map.put(
"What""chenyz");
        map.put(
"You""chenyz");
        map.put(
"Don't""chenyz");
        map.put(
"Know""chenyz");
        map.put(
"About""chenyz");
        map.put(
"Geo""chenyz");
        map.put(
"APIs""chenyz");
        map.put(
"Can't""chenyz");
        map.put(
"Hurt""chenyz");
        map.put(
"you""chenyz");
        map.put(
"google""chenyz");
        map.put(
"map""chenyz");
        map.put(
"hello""chenyz");
    }

褰撴垜浠柊娣誨姞涓涓厓绱犳椂錛岄鍏堟垜浠氳繃Hash綆楁硶璁$畻鍑鴻繖涓厓绱犵殑Hash鍊肩殑hashcode錛岄氳繃榪欎釜hashcode鐨勫鹼紝鎴戜滑灝卞彲浠ヨ綆楀嚭榪欎釜鏂板厓绱犲簲璇ュ瓨鏀懼湪榪欎釜hash琛ㄧ殑鍝釜鏍煎瓙閲岄潰錛屽鏋滆繖涓牸瀛愪腑宸茬粡瀛樺湪鍏冪礌錛岄偅涔堝氨鎶婃柊鐨勫厓绱犲姞鍏ュ埌宸茬粡瀛樺湪鏍煎瓙鍏冪礌鐨勯摼琛ㄤ腑銆?br />
榪愯涓婇潰鐨勭▼搴忥紝鎴戜滑瀵笻ashMap婧愮爜榪涜涓鐐逛慨鏀癸紝鎵撳嵃鍑烘瘡涓猭ey瀵硅薄鐨刪ash鍊?br />
What-->hash鍊鹼細8
You-->hash鍊鹼細3
Don't-->hash鍊鹼細7
Know-->hash鍊鹼細13
About-->hash鍊鹼細11
Geo-->hash鍊鹼細12
APIs-->hash鍊鹼細1
Can't-->hash鍊鹼細7
Hurt-->hash鍊鹼細1
you-->hash鍊鹼細10
google-->hash鍊鹼細3
map-->hash鍊鹼細8
hello-->hash鍊鹼細0

璁$畻鍑烘潵鐨凥ash鍊煎垎鍒唬琛ㄨkey搴旇瀛樻斁鍦℉ash琛ㄤ腑瀵瑰簲鏁板瓧鐨勬牸瀛愪腑錛屽鏋滆鏍煎瓙宸茬粡鏈夊厓绱犲瓨鍦紝閭d箞璇ey灝變互閾捐〃鐨勬柟寮忎緷嬈℃斁鍏ユ牸瀛愪腑



浠庝笂琛ㄥ彲浠ョ湅鍑猴紝Hash琛ㄦ槸綰挎ц〃鍜岄摼琛ㄧ殑緇煎悎鎵寰楋紝鏍規嵁鏁版嵁緇撴瀯鐨勫畾涔夛紝鍙互寰楀嚭綺楀姡鐨勭粨璁猴紝Hash綆楁硶鐨勫瓨鍙栭熷害瑕佹瘮鏁扮粍宸竴浜涳紝浣嗘槸姣旇搗鍗曠函鐨勯摼琛紝鍦ㄦ煡鎵懼拰瀛樺彇鏂歸潰鍗磋濂藉銆?br />
濡傛灉瑕佹煡鎵句竴涓厓绱犳椂錛屽悓鏍風殑鏂瑰紡錛岄氳繃Hash鍑芥暟璁$畻鍑鴻繖涓厓绱犵殑Hash鍊糷ashcode錛岀劧鍚庨氳繃榪欎釜hashcode鍊鹼紝鐩存帴鎵懼埌璺熻繖涓猦ash鍊肩浉瀵瑰簲鐨勭嚎鎬ф牸瀛愶紝榪涘璇ユ牸瀛愬悗錛屽榪欎釜鏍煎瓙瀛樻斁鐨勯摼琛ㄥ厓绱犻愪釜榪涜姣旇緝錛岀洿鍒版壘鍒板搴旂殑hash鍊箋?br />
鍦ㄧ畝鍗曚簡瑙e畬Hash綆楁硶鍚庯紝鎴戜滑鎵撳紑HashMap婧愮爜

鍒濆鍖朒ashMap

涓嬮潰鎴戜滑鐪嬬湅Map map = new HashMap();榪欐浠g爜絀剁珶鍋氫簡浠涔堬紝鍙戠敓浜嗕粈涔堟暟鎹粨鏋勭殑鍙樺寲銆?br />
HashMap涓嚑涓噸瑕佺殑灞炴?br />
transient Entry[] table;
鐢ㄦ潵淇濆瓨key-value鐨勫璞ntry鏁扮粍錛屼篃灝辨槸Hash琛?br />
transient int size;
榪斿洖HashMap鐨勯敭鍊煎涓暟

final float loadFactor;
璐熻澆鍥犲瓙錛岀敤鏉ュ喅瀹欵ntry鏁扮粍鏄惁鎵╁鐨勫洜瀛愶紝HashMap榛樿鏄?.75f

int threshold;
閲嶆瀯鍥犲瓙錛?capacity * load factor)璐熻澆鍥犲瓙涓嶦ntry[]鏁扮粍瀹圭Н鐨勪箻鍊?br />
public class HashMap<K,V>
    
extends AbstractMap<K,V>
    
implements Map<K,V>, Cloneable, Serializable
{
    
int threshold;    

    
final float loadFactor;

    
transient Entry[] table;

    
static final float DEFAULT_LOAD_FACTOR = 0.75f;

    
static final int DEFAULT_INITIAL_CAPACITY = 16;

    
public HashMap(int initialCapacity, float loadFactor) {
        
if (initialCapacity < 0)
            
throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        
if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity 
= MAXIMUM_CAPACITY;
        
if (loadFactor <= 0 || Float.isNaN(loadFactor))
            
throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);

        
// Find a power of 2 >= initialCapacity
        int capacity = 1;
        
while (capacity < initialCapacity)
            capacity 
<<= 1;

        
this.loadFactor = loadFactor;
        threshold 
= (int)(capacity * loadFactor);
        table 
= new Entry[capacity];
        init();
    }
浠ublic HashMap(int initialCapacity, float loadFactor)鏋勯犲嚱鏁頒負渚嬶紝鍙﹀涓や釜鏋勯犲嚱鏁板疄闄呬笂涔熸槸浠ュ悓縐嶆柟寮忔潵鏋勫緩HashMap.

棣栧厛鏄紜畾hashMap鐨勫垵濮嬪寲鐨勯暱搴︼紝榪欓噷浣跨敤鐨勭瓥鐣ユ槸寰幆鏌ュ嚭涓涓ぇ浜巌nitialCapacity鐨?鐨勬鏂圭殑鏁幫紝渚嬪initialCapacity鐨勫兼槸10錛岄偅涔堝ぇ浜?0鐨勬暟鏄?鐨?嬈℃柟錛屼篃灝辨槸16錛宑apacity鐨勫艱璧嬩簣浜?6錛岄偅涔堝疄闄呬笂table鏁扮粍鐨勯暱搴︽槸16錛屼箣鎵浠ラ噰鐢ㄨ繖鏍風殑絳栫暐鏉ユ瀯寤篐ash琛ㄧ殑闀垮害錛屾槸鍥犱負2鐨勬鏂硅繍綆楀浜庤綆楁満鏉ヨ鏄湁鐩稿綋鐨勬晥鐜囥?br />
loadFactor錛岃縐頒負璐熻澆鍥犲瓙錛孒ashMap鐨勯粯璁よ礋杞藉洜瀛愭槸0.75f

threshold錛屾帴涓嬫潵鏄噸鏋勫洜瀛愶紝鐢辮礋杞藉洜瀛愬拰瀹歸噺鐨勪箻鏈虹粍鎴愶紝瀹冭〃紺哄綋HashMap鍏冪礌琚瓨鏀句簡澶氬皯涓箣鍚庯紝闇瑕佸HashMap榪涜閲嶆瀯銆?br />
閫氳繃榪欎竴緋誨垪鐨勮綆楀拰瀹氫箟鍚庯紝鍒濆鍖朎ntry[] table;

put(key,value)

鎺ヤ笅鏉ョ湅涓瀵筴ey-value鏄浣曡瀛樻斁鍒癏ashMap涓細put(key,value)

    public V put(K key, V value) {
        
if (key == null)
            
return putForNullKey(value);
        
int hash = hash(key.hashCode());
        
        
int i = indexFor(hash, table.length);
        System.out.println(key
+"-->hash鍊鹼細"+i);//榪欏氨鏄垰鎵嶇▼搴忔墦鍗板嚭鏉ョ殑key瀵瑰簲hash鍊?/span>
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue 
= e.value;
                e.value 
= value;
                e.recordAccess(
this);
                
return oldValue;
            }
        }

        modCount
++;
        addEntry(hash, key, value, i);
        
return null;
    }

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

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

榪欓噷鏄暣涓猦ash鐨勫叧閿紝璇鋒墦寮婧愮爜鏌ョ湅涓姝ヤ竴姝ユ煡鐪嬨?br />
hash(key.hashCode()) 璁$畻鍑簁ey鐨刪ash鐮?//瀵逛簬hash()鐨勭畻娉曪紝榪欓噷鏈変竴綃囧垎鏋愬緢閫忓交鐨勬枃绔?lt;HashMap hash鏂規硶鍒嗘瀽>
indexFor(hash, table.length) 閫氳繃涓涓笌綆楁硶璁$畻鍑烘潵錛岃key搴斿湪瀛樻斁鍦℉ash琛ㄧ殑鍝釜鏍煎瓙涓?br /> for (Entry<K,V> e = table[i]; e != null; e = e.next) 鐒跺悗鍐嶉亶鍘唗able[i]鏍間腑鐨勯摼琛紝鍒ゆ柇鏄惁宸茬粡瀛樺湪涓鏍風殑key錛屽鏋滃瓨鍦ㄤ竴鏍風殑key鍊鹼紝閭d箞灝辯敤鏂扮殑value瑕嗙洊鏃х殑value錛屽茍鎶婃棫鐨剉alue鍊艱繑鍥炪?br /> addEntry(hash, key, value, i) 濡傛灉緇忚繃閬嶅巻閾捐〃娌℃湁鍙戠幇鍚屾牱鐨刱ey錛岄偅涔堣繘琛宎ddEntry鍑芥暟鐨勬搷浣滐紝澧炲姞褰撳墠key鍒癶ash琛ㄤ腑鐨勭i涓牸瀛愪腑鐨勯摼琛ㄤ腑

    void addEntry(int hash, K key, V value, int bucketIndex) {
        Entry
<K,V> e = table[bucketIndex];
        table[bucketIndex] 
= new Entry<K,V>(hash, key, value, e);
        
if (size++ >= threshold)
            resize(
2 * table.length);
    }

Entry<K,V> e = table[bucketIndex];
  鍒涘緩涓涓狤ntry瀵硅薄鏉ュ瓨鏀鵑敭鍊鹼紙ps:Entry瀵硅薄鏄竴涓摼琛ㄥ璞★級
table[bucketIndex] = new Entry<K,V>(hash, key, value, e); 灝咵ntry瀵硅薄娣誨姞鍒伴摼琛ㄤ腑
if (size++ >= threshold) resize(2 * table.length); 鏈鍚庡皢size榪涜鑷錛屽垽鏂璼ize鍊兼槸鍚﹀ぇ浜庨噸鏋勫洜瀛愶紝濡傛灉澶т簬閭d箞灝辨槸鐢╮esize榪涜鎵╁閲嶆瀯銆?br />
    void resize(int newCapacity) {
        Entry[] oldTable 
= table;
        
int oldCapacity = oldTable.length;
        
if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold 
= Integer.MAX_VALUE;
            
return;
        }

        Entry[] newTable 
= new Entry[newCapacity];
        transfer(newTable);
        table 
= newTable;
        threshold 
= (int)(newCapacity * loadFactor);
    }

榪欓噷涓轟粈涔堟槸鍚﹂渶瑕佹墿瀹歸噸鏋勶紝鍏跺疄鏄秹鍙婂埌璐熻澆鍥犲瓙鐨勬ц兘闂

loadFactor璐熻澆鍥犲瓙
涓婇潰璇磋繃loadFactor鏄竴涓猦ashMap鐨勫喅瀹氭у睘鎬э紝HashSet鍜孒ashMap鐨勯粯璁よ礋杞藉洜瀛愰兘鏄?.75錛屽畠琛ㄧず錛屽鏋滃搱甯岃〃鐨勫閲忚秴榪?/4鏃訛紝灝嗚嚜鍔ㄦ垚鍊嶇殑澧炲姞鍝堝笇琛ㄧ殑瀹歸噺錛岃繖涓兼槸鏉冭 浜嗘椂闂村拰絀洪棿鐨勬垚鏈紝濡傛灉璐熻澆鍥犲瓙杈冮珮錛岃櫧鐒朵細鍑忓皯瀵瑰唴瀛樼┖闂寸殑闇姹傦紝浣嗕篃浼氬鍔犳煡鎵炬暟鎹殑鏃墮棿寮閿錛屾棤璁烘槸put()鍜実et()閮芥秹鍙婂埌瀵規暟鎹繘琛屾煡鎵劇殑鍔ㄤ綔錛屾墍浠ヨ礋杞藉洜瀛愭槸涓嶉傚疁璁劇疆榪囬珮



get(key)

鎺ヤ笅鏉ョ湅鐪媑et(key)鍋氫簡浠涔?br />
    public V get(Object key) {
        
if (key == null)
            
return getForNullKey();
        
int hash = hash(key.hashCode());
        
for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e 
!= null;
             e 
= e.next) {
            Object k;
            
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                
return e.value;
        }
        
return null;
    }

榪欎簺鍔ㄤ綔浼間箮鏄窡put(key錛寁alue)鐩歌瘑錛岄氳繃hash綆楁硶鑾峰彇key鐨刪ash鐮侊紝鍐嶉氳繃indexFor瀹氫綅鍑鴻key瀛樺湪浜巘able鐨勫摢涓涓笅琛紝鑾峰彇璇ヤ笅鏍囩劧鍚庡涓嬫爣涓殑閾捐〃榪涜閬嶅巻姣斿錛屽鏋滄湁絎﹀悎灝辯洿鎺ヨ繑鍥炶key鐨剉alue鍊箋?br />
keySet()

榪欓噷榪樻秹鍙婂彟涓涓棶棰橈紝涓婇潰璇翠簡HashMap鏄窡set娌℃湁浠諱綍浜插睘鍏崇郴錛屼絾map涔熶竴鏍峰疄鐜頒簡keySet鎺ュ彛錛屼笅闈㈣氨鏋愪竴涓媖eySet鍦╤ashMap涓槸濡備綍瀹炵幇鐨勶紝榪欓噷緇欏嚭閮ㄥ垎浠g爜錛岃緇撳悎婧愮爜鏌ョ湅

public K next() {
            
return nextEntry().getKey();
        }

    
final Entry<K,V> nextEntry() {
            
if (modCount != expectedModCount)
                
throw new ConcurrentModificationException();
            Entry
<K,V> e = next;
            
if (e == null)
                
throw new NoSuchElementException();

            
if ((next = e.next) == null) {
                Entry[] t 
= table;
                
while (index < t.length && (next = t[index++]) == null)
                    ;
            }
        current 
= e;
            
return e;
        }

浠g爜寰堢畝鍗曪紝灝辨槸瀵規瘡涓牸瀛愰噷闈㈢殑閾捐〃榪涜閬嶅巻錛屼篃姝f槸榪欎釜鍘熷洜錛屽綋鎴戜滑渚濇灝唊ey鍊紁ut榪沨ashMap涓紝浣嗗湪浣跨敤map.entrySet().iterator()榪涜閬嶅巻鏃跺欏嵈涓嶆槸put鏃跺欑殑欏哄簭銆?br />
鎵╁
鍦ㄥ墠闈㈣鍒皃ut鍑芥暟鐨勬椂鍊欙紝宸茬粡鎻愯繃浜嗘墿瀹圭殑闂

if (size++ >= threshold)
resize(
2 * table.length);


榪欓噷涓涓槸鍚︽墿瀹圭殑鍒ゆ柇錛屽綋鏁版嵁杈懼埌浜唗hreshold鎵璋撶殑閲嶆瀯鍥犲瓙錛岃屼笉鏄疕ashMap鐨勬渶澶у閲忥紝灝辮繘琛屾墿瀹廣?br />

    
void resize(int newCapacity) {
        Entry[] oldTable 
= table;
        
int oldCapacity = oldTable.length;
        
if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold 
= Integer.MAX_VALUE;
            
return;
        }

        Entry[] newTable 
= new Entry[newCapacity];
        transfer(newTable);
        table 
= newTable;
        threshold 
= (int)(newCapacity * loadFactor);
    }

    
void transfer(Entry[] newTable) {
        Entry[] src 
= table;
        
int newCapacity = newTable.length;
        
for (int j = 0; j < src.length; j++) {
            Entry
<K,V> e = src[j];
            
if (e != null) {
                src[j] 
= null;
                
do {
                    Entry
<K,V> next = e.next;
                    
int i = indexFor(e.hash, newCapacity);
                    e.next 
= newTable[i];
                    newTable[i] 
= e;
                    e 
= next;
                } 
while (e != null);
            }
        }
    }


transfer鏂規硶瀹為檯涓婃槸灝嗘墍鏈夌殑鍏冪礌閲嶆柊榪涜涓浜沨ash錛岃繖鏄洜涓哄閲忓彉鍖栦簡錛屾瘡涓厓绱犵浉瀵瑰簲鐨刪ash鍊間篃浼氫笉涓鏍楓?br />
浣跨敤HashMap

1.涓嶈鍐嶉珮騫跺彂涓嬌鐢℉ashMap錛孒ashMap鏄嚎紼嬩笉瀹夊叏錛屽鏋滆澶氫釜綰跨▼鍏變韓涔嬪悗錛屽皢鍙兘鍙戠敓涓嶅彲棰勭煡鐨勯棶棰樸?br /> 2.濡傛灉鏁版嵁澶у皬浜嬪浐瀹氱殑錛屾渶濂藉湪鍒濆鍖栫殑鏃跺欏氨緇橦ashMap涓涓悎鐞嗙殑瀹歸噺鍊鹼紝濡傛灉浣跨敤new HashMap()榛樿鏋勯犲嚱鏁幫紝閲嶆瀯鍥犲瓙鐨勫兼槸16*0.75=12錛屽綋HashMap鐨勫閲忚秴榪囦簡12鍚庯紝灝變細榪涜涓緋誨垪鐨勬墿瀹硅繍綆楋紝閲嶅緩涓涓師鏉ユ垚鍊嶇殑鏁扮粍錛屽茍涓斿鍘熸潵瀛樺湪鐨勫厓绱犺繘琛岄噸鏂扮殑hash榪愮畻錛屽鏋滀綘鐨勬暟鎹槸鏈夋垚鍗冧笂涓囩殑錛岄偅涔堜綘鐨勬垚鍗冧笂涓囩殑鏁版嵁涔熻璺熻繖浣犵殑鎵╁涓嶆柇鐨刪ash錛岃繖灝嗕駭鐢熼珮棰濈殑鍐呭瓨鍜宑pu鐨勫ぇ閲忓紑閿銆?br />
褰撶劧鍟︼紝HashMap鐨勫嚱鏁拌繕鏈夊緢澶氾紝涓嶈繃閮芥槸鍩轟簬table鐨勯摼琛ㄨ繘琛屾搷浣滐紝褰撶劧涔熷氨鏄痟ash綆楁硶錛孧ap & hashMap鍦ㄥ鉤鏃舵垜浠殑搴旂敤闈炲父澶氾紝鏈閲嶈鐨勬槸鎴戜滑瑕佸姣忓彞浠g爜涓瘡鍧楁暟鎹粨鏋勫彉鍖栧績涓湁鏁般?br />


涓婇潰涓昏鏄弬鑰冧簡jdk婧愮爜錛屾暟鎹粨鏋勫拰涓浜涚浉鍏寵祫鏂欐湰鐫濂借鎬т笉濡傜儌鍗氬鐨勭簿紲炶褰曚笅鏉ワ紝甯屾湜鏈嬪弸浠鏋滃彂瑙夊摢閲屼笉瀵硅鎸囧嚭鏉ワ紝铏氬績璇鋒暀

----------------------------------------

by 闄堜簬鍠?
QQ:34174409
Mail: dongbule@163.com


]]>
java鏁版嵁緇撴瀯-Listhttp://m.tkk7.com/dongbule/archive/2011/01/16/343063.html闄堜簬鍠?/dc:creator>闄堜簬鍠?/author>Sun, 16 Jan 2011 09:36:00 GMThttp://m.tkk7.com/dongbule/archive/2011/01/16/343063.htmlhttp://m.tkk7.com/dongbule/comments/343063.htmlhttp://m.tkk7.com/dongbule/archive/2011/01/16/343063.html#Feedback0http://m.tkk7.com/dongbule/comments/commentRss/343063.htmlhttp://m.tkk7.com/dongbule/services/trackbacks/343063.html ArrayList
ArrayList鍏跺疄灝辨槸涓緇勯暱搴﹀彲鍙樼殑鏁扮粍錛屽綋瀹炰緥鍖栦簡涓涓狝rrayList錛岃鏁版嵁涔熻瀹炰緥鍖栦簡錛屽綋鍚戦泦鍚堜腑娣誨姞瀵硅薄鏃訛紝鏁扮粍鐨勫ぇ灝忎篃闅忕潃鏀瑰彉錛岃繖鏍峰畠鎵甯︽潵鐨勬湁浼樼偣鏄揩閫熺殑闅忔満璁塊棶錛屽嵆浣胯闂瘡涓厓绱犳墍甯︽潵鐨勬ц兘闂涔熸槸寰堝皬鐨勶紝浣嗙己鐐瑰氨鏄兂鍏朵腑娣誨姞鎴栧垹闄ゅ璞¢熷害鎱紝褰撲綘鍒涘緩鐨勬暟緇勬槸涓嶇‘瀹氬叾瀹歸噺錛屾墍浠ュ綋鎴戜滑鏀瑰彉榪欎釜鏁扮粍鏃跺氨蹇呴』鍦ㄥ唴瀛樹腑鍋氬緢澶氱殑澶勭悊錛屽浣犳兂瑕佹暟緇勪腑浠繪剰涓や釜鍏冪礌涓棿娣誨姞瀵硅薄錛岄偅涔堝湪鍐呭瓨涓暟緇勮縐誨姩鎵鏈夊悗闈㈢殑瀵硅薄銆?br />
LinkedList
LinkedList鏄氳繃鑺傜偣鐨勮繛鎺ュ疄鐜伴摼琛ㄧ殑鏁版嵁緇撴瀯錛屽悜linkedList涓彃鍏ユ垨鍒犻櫎鍏冪礌鐨勯熷害鏄壒鍒揩錛岃岄殢鏈鴻闂殑閫熷害鐩稿杈冩參錛岃繖涓槸鐢變簬閾捐〃鏈韓鐨勬ц川閫犳垚鐨勶紝鍦ㄩ摼琛ㄤ腑錛屾瘡涓妭鐐歸兘鍖呭惈浜嗗墠涓涓妭鐐圭殑寮曠敤錛屽悗涓涓妭鐐圭殑寮曠敤鍜岃妭鐐瑰瓨鍌ㄥ鹼紝褰撲竴涓柊鑺傜偣鎻掑叆寮忥紝鍙渶瑕佷慨鏀瑰叾涓浉鍏崇殑鍓嶅悗鍏崇郴鑺傜偣寮曠敤鍗沖彲錛屽垹闄よ妭鐐逛篃鏄竴鏍楓傛搷浣滃璞″彧闇瑕佹敼鍙樿妭鐐圭殑閾炬帴錛屾柊鑺傜偣鍙互瀛樻斁鍦ㄥ唴瀛樼殑浠諱綍浣嶇疆錛屼絾涔熷氨鏄洜涓哄姝inkedList铏界劧瀛樺湪get()鏂規硶錛屼絾鏄繖涓柟娉曢氳繃閬嶅巻鑺傜偣鏉ュ畾浣嶆墍浠ラ熷害寰堟參銆侺inkedList榪樺崟鐙叿addFrist(),addLast(),getFrist(),getLast(),removeFirst(),removeLast()鏂規硶錛岃繖浜涙柟娉曚嬌寰桳inkedList鍙互浣滀負鍫嗘爤錛岄槦鍒楋紝鍜屽弻闃熷垪鏉ヤ嬌鐢ㄣ?br />
璇寸櫧浜嗭紝ArrayList鍜孡inkedList灝辨槸鏁版嵁緇撴瀯涓殑欏哄簭瀛樺偍琛ㄥ拰閾懼紡瀛樺偍琛ㄣ?br />
ArrayList鏋勯犲師鐞?/strong>
涓婇潰宸茬粡娓呮ArrayList鍜孡inkedList灝辨槸鏁版嵁緇撴瀯鐨勯『搴忚〃鍜岄摼琛?涓嶆竻妤氱殑緲葷炕鏁版嵁緇撴瀯鐨勪功)錛屼笅闈㈢畝鍗曞垎鏋愪竴涓嬪畠浠殑瀹炵幇鏂瑰紡銆?br /> 涓嬭〃鏄憳鑷猻um鎻愪緵鐨凙rrayList鐨刟pi鏂囨。

ArrayList()
          鏋勯犱竴涓垵濮嬪閲忎負 10 鐨勭┖鍒楄〃銆?br /> ArrayList(Collection<? extends E> c)
          鏋勯犱竴涓寘鍚寚瀹?collection 鐨勫厓绱犵殑鍒楄〃錛岃繖浜涘厓绱犳槸鎸夌収璇?collection 鐨勮凱浠e櫒榪斿洖瀹冧滑鐨勯『搴忔帓鍒楃殑銆?br /> ArrayList(int initialCapacity)
          鏋勯犱竴涓叿鏈夋寚瀹氬垵濮嬪閲忕殑絀哄垪琛ㄣ?br />
絎竴涓瀯閫犲嚱鏁版槸娌℃湁榛樿鏋勫緩浜嗕竴涓垵濮嬪閲?0鐨勭┖鍒楄〃錛岀浜屼釜鏋勯犲嚱鏁版槸鍒跺畾collection鍏冪礌鐨勫垪琛紝絎笁涓瀯閫犲嚱鏁版槸鐢辯敤鎴鋒寚瀹氭瀯閫犵殑鍒楄〃鍒濆鍖栧閲忓灝戯紝濡傛灉浣跨敤絎竴涓瀯閫犲嚱鏁板垯琛ㄧず榛樿璋冪敤璇ュ弬鏁頒負initialCapacity=10鏉ユ瀯閫犱竴涓垪琛ㄥ璞°?br />
ArrayList婧愮爜紼嶅井榪涜鍒嗘瀽

public class ArrayList<E> extends AbstractList<E>
        
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    
private static final long serialVersionUID = 8683452581122892189L;

    
private transient Object[] elementData;

    
private int size;

    
public ArrayList(int initialCapacity) {
    
super();
        
if (initialCapacity < 0)
            
throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
    
this.elementData = new Object[initialCapacity];
    }

    
public ArrayList() {
    
this(10);
    }

    
public ArrayList(Collection<? extends E> c) {
    elementData 
= c.toArray();
    size 
= elementData.length;
    
// c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData 
= Arrays.copyOf(elementData, size, Object[].class);
    }

    
public int size() {
    
return size;
    }

}


鍙互鍙戠幇ArrayList涓寘鍚袱涓富瑕佺殑灞炴?br />
    private transient Object[] elementData;

    private int size;

鍏朵腑elementData[]鏄垪琛ㄧ殑瀹炵幇鐨勬牳蹇冩暟緇勶紝鎴戜滑浣跨敤璇ユ暟緇勬潵瀛樻斁闆嗗悎涓殑鏁版嵁錛岃屾垜浠殑鏋勯犲嚱鏁版墍浼犻掔殑initialCapacity鍙傛暟鏄瀯寤鴻鏁扮粍鐨勯暱搴︺?br /> 鍦ㄧ湅鐪媠ize鐨勫疄鐜板艦寮忥紝瀹冪殑浣滅敤鏄繑鍥瀞ize鐨勫睘鎬у肩殑澶у皬錛屾垜浠啀鐪嬬湅鍙﹀涓涓瀯閫犲嚱鏁皃ublic ArrayList(Collection<? extends E> c)錛岃鏋勯犲嚱鏁扮殑浣滅敤鏄妸鍙﹀涓涓鍣ㄥ璞′腑鐨勫厓绱犳斁鍏ュ綋鐐圭殑List瀵硅薄涓傞鍏堟槸閫氳繃璋冪敤鍙﹀涓涓鍣ㄥ璞鐨剆ize()鏉ヨ緗綋鍓峀ist瀵硅薄鐨剆ize灞炴х殑闀垮害澶у皬銆傛帴涓嬫潵灝變技涔庡elementData[]鏁扮粍榪涜鍒濆鍖栵紝鏈鍚庨氳繃Arrays.copyOf(U[] original, int newLength, Class<? extends T[]> newType)鏂規硶鎶婂綋鍓嶅鍣ㄤ腑鐨勫璞¢兘瀛樻斁榪涙柊鐨勬暟緇別lementData錛屼富瑕佸氨瀹屾垚浜嗕竴涓垪琛ㄧ殑鍒涘緩銆?br />
ArrayList瀹歸噺鎵╁厖
榪樻湁涓涓棶棰樺氨鏄垜浠墍寤虹珛鐨凙rrayList鏄嬌鐢ㄦ暟緇勬潵瀹炵幇鐨勶紝浣嗘暟緇勭殑闀垮害涓鏃﹁鍒濆鍖栧氨涓嶈兘鏀瑰彉錛岃屾垜浠湪緇欐鍒楄〃瀵硅薄娣誨姞鍏冪礌鏃跺嵈娌℃湁鍙楀埌闀垮害鐨勯檺鍒訛紝鎵浠ワ紝ArrayList鐨別lementData灞炴т竴瀹氭槸瀛樺湪涓涓姩鎬佹墿鍏呭閲忕殑鏈哄埗錛屼笅闈㈡妸鐩稿叧鐨勯儴鍒嗘簮鐮佽創鍑烘潵鍐嶅仛鐮旂┒

public boolean add(E e) {
    ensureCapacity(size 
+ 1);  // Increments modCount!!
    elementData[size++= e;
    
return true;
    }

    
protected transient int modCount = 0;    

    
/**
     * Increases the capacity of this <tt>ArrayList</tt> instance, if
     * necessary, to ensure that it can hold at least the number of elements
     * specified by the minimum capacity argument.
     *
     * 
@param   minCapacity   the desired minimum capacity
     
*/
    
public void ensureCapacity(int minCapacity) {
    modCount
++;
    
int oldCapacity = elementData.length;
    
if (minCapacity > oldCapacity) {
        Object oldData[] 
= elementData;
        
int newCapacity = (oldCapacity * 3)/2 + 1;
            
if (newCapacity < minCapacity)
        newCapacity 
= minCapacity;
            
// minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }

鐪嬬湅public boolean add(E e)鏂規硶錛屽彲浠ュ彂鐜板湪娣誨姞涓涓厓绱犲埌瀹瑰櫒涓殑鏃跺欙紝鎴戜滑浼氬厛閫氳繃ensureCapacity(size + 1)鍒ゆ柇璇ユ暟緇勬槸鍚﹂渶瑕佹墿鍏呫?br /> public void ensureCapacity(int minCapacity)榪欎釜鏂規硶鏄敤鏉ュ垽鏂綋鍓嶇殑鏁扮粍鏄惁闇瑕佹墿鍏咃紝騫朵笖璇ユ墿鍏呭灝戙俶odCount++; 琛ㄧず褰撳墠鐨勫璞″elementData鏁扮粍榪涜浜嗗灝戞鎵╁厖錛屾竻絀哄拰縐婚櫎絳夋搷浣滐紝鐩稿綋浜庢槸涓涓褰撳墠List瀵硅薄鐨勪竴涓搷浣滆褰曟暟銆?br /> int oldCapacity = elementData.length; 鍒濆鍖杘ldCapacity錛岃〃紺轟負褰撳墠elementData鏁扮粍鐨勯暱搴︺?br /> if (minCapacity > oldCapacity) 鍒ゆ柇minCapacity鍜宱ldCapacity璋佸ぇ錛屾潵鍐沖畾鏄惁闇瑕佹墿鍏呫?br /> int newCapacity = (oldCapacity * 3)/2 + 1; 鎵╁厖鐨勭瓥鍒楁槸鍒ゆ柇(oldCapacity * 3)/2 + 1鍜宮inCapacity涓よ呬箣闂磋皝鏇村ぇ錛屽彇鏇村ぇ鐨勬暟浣滀負鎵╁厖鍚庢暟緇勭殑initialCapacity鍊鹼紝鐒跺悗浣跨敤鏁扮粍鎷瘋礉鐨勬柟寮忥紝鎶婁互鍓嶇殑鏁版嵁杞Щ鍒版柊鐨勬暟緇勫璞′腑
濡傛灉minCapacity 灝忎簬 oldCapacity 灝變笉闇瑕佸啀鎵╁厖銆?br />
ArrayList鍒犻櫎鍏冪礌

public E remove(int index) {
    RangeCheck(index);

    modCount
++;
    E oldValue 
= (E) elementData[index];

    
int numMoved = size - index - 1;
    
if (numMoved > 0)
        System.arraycopy(elementData, index
+1, elementData, index,
                 numMoved);
    elementData[
--size] = null// Let gc do its work

    
return oldValue;
    }

    
private void RangeCheck(int index) {
    
if (index >= size)
        
throw new IndexOutOfBoundsException(
        
"Index: "+index+", Size: "+size);
    }

鍦ㄧ湅鐪婣rrayList縐婚櫎鍏冪礌鏄庝箞瀹炵幇鐨勶紝棣栧厛鍒ゆ柇闇瑕佸垹闄ょ殑index鏄惁鍦╡lementData鏁扮粍鐨勪笅鏍囧唴錛屽涓嶅瓨鍦ㄥ垯鎶涘嚭IndexOutOfBoundsException銆?br /> modCount++; 涓庢墿鍏呭厓绱犱竴涓紝鍒犻櫎鍏冪礌涔熻涓嬫潵鎿嶄綔鏁般?br /> E oldValue = (E) elementData[index]; 鑾峰彇闇瑕佸垹闄ゅ厓绱犵殑瀵硅薄銆?br /> int numMoved = size - index - 1; 鑾峰彇闇瑕佽鍒犻櫎鍏冪礌鐨勪笅鏍囷紝鍒犻櫎璇ュ厓绱犲悗錛屾暟緇勯渶瑕佸湪姝ゅ厓绱犱笅鏍囧悗鐨勬墍鏈夊璞¤繘琛屽唴瀛樼殑縐誨姩銆?br /> System.arraycopy(elementData, index+1, elementData, index,numMoved);瀵筺umMoved鍚庨潰鐨勬墍鏈夊璞¢氳繃copy鐨勬柟寮忚繘琛屽唴瀛樼殑縐誨姩閲嶆柊鏋勫緩鏁扮粍銆?br />
璇村畬ArrayList鐨勫疄鐜幫紝鍐嶈璇磍inkedList

鏋勫緩鍙岄摼琛?LinkedList)
LinkedList鏄被浼間簬C璇█鐨勫弻閾捐〃錛屽弻閾捐〃姣斿崟閾捐〃澶氫簡涓涓煙錛岃繖涓弻閾捐〃灝辨湁浜嗕笁涓煙錛屼竴涓煙鏉ョ敤瀛樺偍鏁版嵁鍏冪礌錛屼竴涓敤鏉ユ寚鍚戝悗緇妭鐐癸紝鍙︿竴涓槸鎸囧悜緇撶偣鐨勭洿鎺ュ墠椹辮妭鐐廣?br />
public class LinkedList<E>
    
extends AbstractSequentialList<E>
    
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    
private transient Entry<E> header = new Entry<E>(nullnullnull);
    
private transient int size = 0;

    
public LinkedList() {
        header.next 
= header.previous = header;
    }

    
private static class Entry<E> {
    E element;
    Entry
<E> next;
    Entry
<E> previous;

    Entry(E element, Entry
<E> next, Entry<E> previous) {
        
this.element = element;
        
this.next = next;
        
this.previous = previous;
    }
    }

}

鍦‥ntry綾諱腑錛屽畾涔変簡涓変釜灞炴э紝鍒嗗埆涓篍 element 琛ㄧず鏁版嵁涓庯紝Entry<E> next涓哄悗緇寚閽堝煙錛孍ntry<E> previous涓哄墠椹辨寚閽堝煙銆?br /> 鍦↙inkedList涓畾涔変簡涓涓噸瑕佺殑灞炴eader錛屽ご緇撶偣錛屼笉浼氱撼鍏ラ摼琛ㄧ殑鎬誨厓绱?璇ヨ妭鐐圭殑previous鏄寚鍚戞渶鍚庤妭鐐癸紝next鏄寚鍚戠涓鑺傜偣銆?br /> 鏋勯犲嚱鏁癓inkedList() 鏋勯犱竴涓┖鍒楄〃銆傚皢header鐨勫墠椹辨寚閽堝煙鍜屽悗緇寚閽堝煙閮芥寚鍚戜簡鑷繁,鐪嬪埌榪欓噷鍙互鍙戠幇錛宯ext鍜宲revious灝辨槸涓涓紩鐢紝鍏跺疄涔熺浉絳変簬C閲岄潰鐨勬寚閽堬紝涓嶈繃C涓嶄細澶勭悊絀烘寚閽堬紝鐩存帴鏀炬搷浣滅郴緇熷鐞嗕簡錛宩ava灝辯洿鎺ユ姏鍑篘ullPointerException錛屾牴鏈笉璁╁畠鐮村潖緋葷粺鐨勬満浼氥?br />
LinkedList鍏冪礌鍙樺姩
涓婇潰璇村埌浜哃inkedList鐨勬柊澧炲拰鍒犻櫎鐨勬晥鐜囨瘮ArrayList鐨勯珮錛屽疄闄呬笂鍦?閾捐〃鎿嶄綔榪欎簺鏂規硶鏃訛紝鍙渶瑕佹敼鍙?涓妭鐐瑰悇鑷殑鍓嶉┍鎸囬拡鍜屽悗緇寚閽堝煙錛岃孉rrayList鏄渶瑕佺Щ鍔ㄥ緢澶氱殑鍏冪礌銆?br />
public boolean add(E e) {
    addBefore(e, header);
        
return true;
    }

    
private Entry<E> addBefore(E e, Entry<E> entry) {
    Entry
<E> newEntry = new Entry<E>(e, entry, entry.previous);
    newEntry.previous.next 
= newEntry;
    newEntry.next.previous 
= newEntry;
    size
++;
    modCount
++;
    
return newEntry;
    }

    
private E remove(Entry<E> e) {
    
if (e == header)
        
throw new NoSuchElementException();

        E result 
= e.element;
    e.previous.next 
= e.next;
    e.next.previous 
= e.previous;
        e.next 
= e.previous = null;
        e.element 
= null;
    size
--;
    modCount
++;
        
return result;
    }

鐩告瘮ArrayList鐨刟dd()鏂規硶錛孡inkedList瀹炵幇璧鋒潵闈炲父綆鍗曪紝涓昏鏄袱琛屼唬鐮侊細
newEntry.previous.next = newEntry;灝嗕笂涓鑺傜偣鐨勫悗緇妭鐐規寚鍚戞柊澧炵殑鑺傜偣
newEntry.next.previous = newEntry;澶磋妭鐐圭殑鍓嶉┍鑺傜偣鎸囧悜鏂板鑺傜偣錛宻ize鍜宮odCount鑷璁板綍銆?br />
鍚屾牱remove鐨勫疄鐜頒篃闈炲父綆鍗?br /> e.previous.next = e.next;璇ヨ妭鐐圭殑鍚庝竴鑺傜偣鐨勫悗鍘昏妭鐐規寚鍚戣鑺傜偣鐨勫悗椹辮妭鐐癸紝
e.next.previous = e.previous;璇ヨ妭鐐圭殑鍚庝竴鑺傜偣鐨勫墠椹辮妭鐐規寚鍚戣鑺傜偣鐨勫墠椹辮妭鐐廣?br /> e.next = e.previous = null;鎶婅鑺傜偣鐨勫墠椹辮妭鐐瑰拰鍚庨┍鑺傜偣鍏ㄩ儴鎸囧悜null銆?br /> e.element = null;鎶婅鑺傜偣鐨勬暟鎹煙璁劇疆涓簄ull銆?br />
闅忔満璁塊棶
鐩告瘮欏哄簭琛紝閾捐〃鐨勯殢鏈鴻闂晥鐜囪浣庡緱澶?鐞嗚璇存硶錛屼笉鏄粷瀵?錛孉rrayList鍙互鏍規嵁绱㈠紩鍙瘋繘琛岄殢鏈鴻闂紝鑰孡inkedList鍒欎笉瑕侀亶鍘嗚闂?br />
public E get(int index) {
        
return entry(index).element;
    }

    
private Entry<E> entry(int index) {
        
if (index < 0 || index >= size)
            
throw new IndexOutOfBoundsException("Index: "+index+
                                                
", Size: "+size);
        Entry
<E> e = header;
        
if (index < (size >> 1)) {
            
for (int i = 0; i <= index; i++)
                e 
= e.next;
        } 
else {
            
for (int i = size; i > index; i--)
                e 
= e.previous;
        }
        
return e;
    }

涓婂垪鐨勪唬鐮佹槸瀵逛竴涓摼琛ㄧ殑閬嶅巻錛屽叾涓寘鍚簡涓涓畻娉曪紝濡傛灉緇欑殑绱㈠紩鍙峰皬浜庢昏妭鐐規暟鐨勪竴鍗婏紝鍒欏湪閾捐〃鐨勫墠鍗婇儴鍒嗙涓涓妭鐐瑰畬榪涜閬嶅巻錛屽鏋滅粰鐨勭儲寮曞彿澶т簬鎬昏妭鐐規暟鐨勪竴鍗婏紝鍒欎粠鏈鍚庝竴涓妭鐐瑰線鍓嶈繘琛岄亶鍘嗙洿鍒扮儲寮曞彿銆?br />
鏈鍚?strong>鎬葷粨
涓涓婣rrayList鍜孡inkedList鐨勫悇鑷壒鐐?br /> 1.ArrayList鏄熀浜庣嚎鎬ц〃鐨勯『搴忓瓨鍌ㄨ〃錛孡inkedList鏄熀鏈嚎鎬ц〃鐨勯摼琛ㄥ瓨鍌ㄨ〃銆?br /> 2.瀵逛簬鏂板鍜屽垹闄ゅ厓绱狅紝LinkedList姣旇緝鍗犳湁浼樺娍錛屽彧闇瑕佸彉鍓嶅悗2涓妭鐐癸紝鑰孉rrayList瑕佺Щ鍔ㄦ暟鎹?br /> 3.瀵逛簬闅忔満璁塊棶鏉ヨ錛孉rrayList姣旇緝鍗犳湁浼樺娍錛屽彲浠ユ牴鎹儲寮曞彿蹇熻闂紝鑰孡inkedList鍒欓渶瑕侀亶鍘嗛泦鍚堢殑鍏冪礌鏉ュ畾浣嶃?br /> 4.鑰屽浜庤凱浠f搷浣?iterate)鍜屾煡鎵炬搷浣?indexOf)錛屼袱鑰呮槸宸笉澶氥?br /> 涓嶈繃涓婇潰閮芥槸鍩轟簬鐞嗚錛屽叿浣撻棶棰樿繕鏄鏍規嵁浜嬪疄榪涜鍒嗘瀽錛屽ArrayList鍒犻櫎鐨勫厓绱犲垰濂芥槸闃熷垪鐨勬渶鍚庝竴涓厓绱狅紝閭d箞鏄棤闇瑕佺Щ鍔ㄦ暟鎹殑錛屽ぇ浣撴垜浠彲浠ヨ涓洪渶瑕侀殢鏈鴻闂緝澶氱殑閭d箞姣旇緝閫傚悎鐢ˋrrayList錛屽鏋滄槸鎻掑叆鍜屽垹闄?濡傛秷鎭槦鍒?杈冨鐨勯偅涔堝氨闇瑕佽冭檻LinkedList銆?br />
涓婇潰涓昏鏄弬鑰冧簡jdk婧愮爜錛屾暟鎹粨鏋勫拰涓浜涚浉鍏寵祫鏂欐湰鐫濂借鎬т笉濡傜儌鍗氬鐨勭簿紲炶褰曚笅鏉ワ紝甯屾湜鏈嬪弸浠鏋滃彂瑙夊摢閲屼笉瀵硅鎸囧嚭鏉ワ紝铏氬績璇鋒暀

----------------------------------------

by 闄堜簬鍠?
QQ:34174409
Mail: dongbule@163.com


]]>
java鏁版嵁緇撴瀯-sethttp://m.tkk7.com/dongbule/archive/2011/01/06/342446.html闄堜簬鍠?/dc:creator>闄堜簬鍠?/author>Thu, 06 Jan 2011 10:07:00 GMThttp://m.tkk7.com/dongbule/archive/2011/01/06/342446.htmlhttp://m.tkk7.com/dongbule/comments/342446.htmlhttp://m.tkk7.com/dongbule/archive/2011/01/06/342446.html#Feedback0http://m.tkk7.com/dongbule/comments/commentRss/342446.htmlhttp://m.tkk7.com/dongbule/services/trackbacks/342446.html
        Set<String> set = new HashSet<String>();
        String a 
= "1",b = "2",c = "1",d = "3",e = "2";
        set.add(a);
        set.add(b);
        set.add(c);
        set.add(d);
        set.add(e);
        
        Iterator it 
= set.iterator();
        
while(it.hasNext()){
            String s 
= (String)it.next();
            System.out.print(s
+",");
        }
        System.out.println(
"涓鍏辨湁瀵硅薄錛?/span>"+set.size()+"涓?/span>"); //鎵撳嵃緇撴灉鏄細3,2,1,涓鍏辨湁瀵硅薄錛?涓?/div>
鎴戜滑閮界煡閬揝et鏄竴縐嶆渶綆鍗曠殑闆嗗悎錛屽璞$殑鎺掑簭鏃犵壒瀹氱殑瑙勫垯錛岄泦鍚堥噷闈㈠瓨鏀劇殑鏄璞$殑寮曠敤錛屾墍浠ユ病鏈夐噸澶嶇殑瀵硅薄錛屽湪涓婇潰鐨勪唬鐮佷腑錛岀▼搴忓垱寤轟簡a銆乥銆乧銆乨銆乪浜斾釜鍙橀噺錛屽叾涓璦鍜宑錛宐鍜宔鎵寮曠敤鐨勫瓧絎︿覆鏄竴鑷寸殑錛岀劧鍚庡悜set娣誨姞浜嗚繖5涓彉閲忋傛墦鍗板嚭鏉ョ殑size()鍙湁3涓紝瀹為檯涓婂悜闆嗗悎鍔犲叆鐨勫彧鏈?涓璞★紝鍦ㄦ墽琛孲et鐨刟dd()鏂規硶鏃跺凡緇忚繘琛屼簡鍒ゆ柇榪欎釜瀵硅薄鏄惁瀛樺湪浜庨泦鍚堬紝濡傛灉瀵硅薄宸茬粡瀛樺湪鍒欎笉緇х畫鎵ц銆?br />

Set鐨勬帴鍙f湁涓や釜瀹炵幇綾伙紝HashSet鍜孴reeSet錛孒ashSet鏄寜鐓у搱甯岀畻娉曟潵榪涜瀛樺彇闆嗗悎涓殑瀵硅薄錛屽瓨鍙栭熷害姣旇緝蹇紝TreeSet綾繪樉紺轟簡SortedSet鎺ュ彛錛屽叿鏈夋帓搴忓姛鑳?br />
HashSet
HashSet鏄寜鐓у搱甯岀畻娉曟潵瀛樺彇闆嗗悎涓殑瀵硅薄錛屽叿鏈夊緢濂界殑瀛樺彇鍜屾煡鎵炬ц兘錛屽綋鍚戦泦鍚堜腑鍔犲叆涓涓璞℃椂錛孒ashSet浼氳皟鐢ㄥ璞$殑hashCode()鏂規硶鏉ヨ幏鍙栧搱甯岀爜錛岀劧鍚庢牴鎹繖涓搱甯屽悧鏉ヨ綆楀璞″湪闆嗗悎涓殑瀛樻斁浣嶇疆銆?br /> 鍦∣bject綾諱腑瀹氫箟浜唄ashCode()鍜宔qual()錛宔qual()鏄寜鐓у唴瀛樺湴鍧姣旇緝瀵硅薄鏄惁鐩稿悓錛屽鏋渙bject1.equal(object1)w涓簍rue鏃訛紝鍒欒〃鏄庝簡object1鍜宱bject2鍙橀噺瀹為檯涓婂紩鐢ㄤ簡鍚屼竴涓璞★紝閭d箞object1鍜宱bject2鐨勫搱甯岀爜涔熸槸鑲畾鐩稿悓銆?br /> 紼嶅井鐨勭湅鐪婬ashSet鐨勬簮鐮?br />
public class HashSet<E>
    
extends AbstractSet<E>
    
implements Set<E>, Cloneable, java.io.Serializable
{

    
private transient HashMap<E,Object> map;
    
private static final Object PRESENT = new Object();
        
public HashSet() {
        map 
= new HashMap<E,Object>();
    }

   
public boolean add(E e) {
        
return map.put(e, PRESENT)==null;
    }
}

public class HashMap<K,V>
    
extends AbstractMap<K,V>
    
implements Map<K,V>, Cloneable, Serializable
{

    
public V put(K key, V value) {
        
if (key == null)
            
return putForNullKey(value);
        
int hash = hash(key.hashCode());
        
int i = indexFor(hash, table.length);
        
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue 
= e.value;
                e.value 
= value;
                e.recordAccess(
this);
                
return oldValue;
            }
        }

        modCount
++;
        addEntry(hash, key, value, i);
        
return null;
    }

}

鎴戜滑浼氬彂鐜版垜浠皟鐢⊿et鐨刟dd()鏂規硶鍏跺疄鏄繑鍥炰竴涓猼ransient HashMap.put(e, PRESENT)錛屽啀璺熻繘HashMap鐨刾ut(K key, V value)鏂規硶榪涜鏌ョ湅,鍙互鐪嬪埌int hash = hash(key.hashCode());浣跨敤浜唖et.add(key)鐨刱ey鍋氫簡涓涓搱甯屽鐞嗗緱鍒頒竴涓搱甯岀爜錛岀劧鍚庡啀灝咵ntry鍋氫簡涓涓亶鍘嗭紝浣跨敤equal()鏂規硶瀵硅鍘熸湁鐨勫璞″拰鏂版坊鍔犵殑瀵硅薄榪涜浜嗕竴涓瘮杈冿紝濡傛灉鍑虹幇浜唗rue鐨勬儏鍐碉紝灝辯洿鎺ヨ繑鍥炰竴涓猳ldValue錛屽鏋滃湪閬嶅巻瀵規瘮鐨勮繃紼嬩腑娌℃湁鍑虹幇ture鐨勬儏鍐碉紝鍒欑戶緇竴涓嬬殑姝ラmodCount++錛屽皢瀵硅薄鎬繪暟鑷姞錛屽茍涓旂戶緇墽琛宎ddEntry()鐨勬搷浣滐紝涓嬮潰娑夊強HashMap鐨勬搷浣滃氨涓嶇戶緇?br />
瀹為檯涓奌ashSet鐨勫簳灞傚疄鐜版槸鍩轟簬HashMap錛屾墍浠ュ湪姝ゅ娑夊強鍒癏ash綆楁硶涓嶅睍寮錛岃緇嗗彲浠ヨ鍙︿竴綃囥?a id="viewpost1_TitleUrl" href="../archive/2011/02/15/344387.html">java鏁版嵁緇撴瀯-HashMap銆?br />
TreeSet
TreeSet綾繪槸瀹炵幇浜哠ortedSet鎺ュ彛錛屾墍浠ヨ兘澶熷闆嗗悎涓殑瀵硅薄榪涜鎺掑簭

        Set iset = new TreeSet();
        iset.add(
new Integer(1));
        iset.add(
new Integer(10));
        iset.add(
new Integer(5));
        iset.add(
new Integer(8));
        iset.add(
"2");
        Iterator it2 
= iset.iterator();
        
while(it2.hasNext()){
            Integer s 
= (Integer)it2.next();
            System.out.print(s
+",");
        }
        System.out.println(
"涓鍏辨湁瀵硅薄錛?/span>"+iset.size()+"涓?/span>");//鎵撳嵃鍑烘潵鐨勭粨鏋滐細1,2,5,8,10,涓鍏辨湁瀵硅薄錛?涓?/span>

褰揟reeSet鍚戦泦鍚堝姞鍏ヤ竴涓璞℃椂錛屼細鎶婂畠鎻掑叆鍒版湁搴忕殑瀵硅薄搴忓垪涓紝TreeSet鍖呮嫭浜嗕袱縐嶆帓搴忔柟寮忥紝鑷劧鎺掑簭鍜屽鎴峰寲鎺掑簭錛屽湪榛樿鐨勬儏鍐典笅浣跨敤鑷劧鎺掑簭銆?br />
鑷劧鎺掑簭
鍦╦dk綾誨簱涓紝鏈夐儴鍒嗙被瀹炵幇浜咰omparable鎺ュ彛錛屽Integer錛孌ouble絳夌瓑錛孋omparable鎺ュ彛鏈変竴涓猚ompareTo()鏂規硶鍙互榪涜姣旇緝錛孴reeSet璋冪敤瀵硅薄鐨刢ompareTo()鏂規硶姣旇緝闆嗗悎涓璞$殑澶у皬錛岀劧鍚庤繘琛屽崌搴忔帓搴忋傚Integer錛?br />
public final class Integer extends Number implements Comparable<Integer> {

    
public int compareTo(Integer anotherInteger) {
    
int thisVal = this.value;
    
int anotherVal = anotherInteger.value;
    
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
    }

}

鍩轟簬Comparable鐨勫睘鎬э紝浣跨敤鑷劧鎺掑簭鏃訛紝鍙兘鍚慣reeSet闆嗗悎涓姞鍏ュ悓綾誨瀷鐨勫璞★紝騫朵笖榪欎簺瀵硅薄鐨勭被蹇呴』瀹炵幇浜咰omparable鐨勬帴鍙o紝浠ヤ笅鎴戜滑灝濊瘯鍚慣reeSet闆嗗悎鍔犲叆涓や釜涓嶅悓綾誨瀷鐨勫璞★紝浼氬彂鐜版姏鍑篊lassCastException

Set iset = new TreeSet();
iset.add(
new Integer(1));
iset.add(
new Integer(8));
iset.add(
"2");
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer

鎴戜滑鍐嶆墦寮TreeSet鐨勬簮鐮佽繘琛屾煡鐪?br />
public class TreeSet<E> extends AbstractSet<E>
    
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
    
private transient NavigableMap<E,Object> m;

    
private static final Object PRESENT = new Object();

    
public boolean add(E e) {
    
return m.put(e, PRESENT)==null;
    }

}

NavigableMap涓烘帴鍙o紝瀹炵幇綾諱負TreeMap

public class TreeMap<K,V>
    
extends AbstractMap<K,V>
    
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
    
private final Comparator<? super K> comparator;

    
private transient Entry<K,V> root = null;

    
public V put(K key, V value) {
        Entry
<K,V> t = root;
        
if (t == null) {
        
// TBD:
        
// 5045147: (coll) Adding null to an empty TreeSet should
        
// throw NullPointerException
        
//
        
// compare(key, key); // type check
            root = new Entry<K,V>(key, value, null);
            size 
= 1;
            modCount
++;
            
return null;
        }
        
int cmp;
        Entry
<K,V> parent;
        
// split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        
if (cpr != null) {
            
do {
                parent 
= t;
                cmp 
= cpr.compare(key, t.key); //姝ゅ濡傛灉綾誨埆涓嶇浉鍚屽彲鑳芥姏鍑篊lassCastException
                if (cmp < 0)
                    t 
= t.left;
                
else if (cmp > 0)
                    t 
= t.right;
                
else
                    
return t.setValue(value);
            } 
while (t != null);
        }
        
else {
            
if (key == null)
                
throw new NullPointerException();
            Comparable
<? super K> k = (Comparable<? super K>) key;
            
do {
                parent 
= t;
                cmp 
= k.compareTo(t.key);
                
if (cmp < 0)
                    t 
= t.left;
                
else if (cmp > 0)
                    t 
= t.right;
                
else
                    
return t.setValue(value);
            } 
while (t != null);
        }
        Entry
<K,V> e = new Entry<K,V>(key, value, parent);
        
if (cmp < 0)
            parent.left 
= e;
        
else
            parent.right 
= e;
        fixAfterInsertion(e);
        size
++;
        modCount
++;
        
return null;
    }

}

棣栧厛鍒ゆ柇鍘熷闆嗗悎鏄惁瀛樺湪錛屽鏋滀笉瀛樺湪鍒欑洿鎺ュ垱寤猴紝鏃犻渶姣旇緝銆?br /> 濡傛灉鍘熷闆嗗悎瀛樺湪鐨勮瘽錛屽厛鍘誨彇鍑篊omparator瀵硅薄錛岀劧鍚庨亶鍘嗗師濮嬮泦鍚坱錛屼嬌鐢╬arent涓轟復鏃舵瘮杈冨鹼紝閫愪釜浣跨敤compare(key, t.key)鏂規硶涓庢坊鍔犲璞ey榪涜姣旇緝錛屽喅瀹氬厓绱犳帓鍦ㄩ泦鍚堢殑left鎴杛ight銆?br />
瀹㈡埛绔帓搴?/strong>
瀹㈡埛绔帓搴忔椂鍥犱負java.util.Comparator<Type>鎺ュ彛鎻愪緵浜嗗叿浣撶殑鎺掑簭鏂瑰紡錛?lt;Type>鎸囧畾浜嗚姣旇緝瀵硅薄鐨勭被鍨嬶紝Comparator鏈変釜compare(Type x,Type y)鐨勬柟娉曪紝鐢ㄤ簬姣旇緝涓や釜瀵硅薄鐨勫ぇ灝忋?br />
public class NameComparator implements Comparator<Name>{
    
    
public int compare(Name n1,Name n2){
        
if(n1.getName().compareTo(n2.getName())>0return -1;
        
if(n1.getName().compareTo(n2.getName())<0return 1;
        
        
return 0;
    }
    
    
public static void main(String[] args) {
        Set
<Name> set = new TreeSet<Name>(new NameComparator());
        
        Name n1 
= new Name("ray");
        Name n2 
= new Name("tom");
        Name n3 
= new Name("jame");
        set.add(n1);
        set.add(n2);
        set.add(n3);
        
        Iterator it 
= set.iterator();
        
while(it.hasNext()){
            Name s 
= (Name)it.next();
            System.out.print(s.getName()
+",");
        }
        System.out.println(
"涓鍏辨湁瀵硅薄錛?/span>"+set.size()+"涓?/span>");
    }
}
//鎵撳嵃緇撴灉鏄細tom,ray,jame,涓鍏辨湁瀵硅薄錛?涓?/span>

閬撶悊涓庤嚜鐒舵帓搴忓叾瀹炵浉鍚岋紝閮芥槸閫氳繃瀹炵幇Comparator鎺ュ彛錛屽氨涓嶇粏璇翠簡,鍙兘鏈変簺璇村緱涓嶅鐨勫湴鏂癸紝嬈㈣繋鎸囨

----------------------------------------

by 闄堜簬鍠?
QQ:34174409
Mail: dongbule@163.com





]]> 主站蜘蛛池模板: 成人a免费α片在线视频网站| 国产高清对白在线观看免费91| 亚洲综合免费视频| 久久亚洲精品无码aⅴ大香| 亚洲AV第一页国产精品| 亚洲国产一区二区a毛片| 亚洲成av人在线视| 亚洲91av视频| 亚洲电影在线免费观看| 亚洲午夜精品国产电影在线观看| 亚洲欧洲综合在线| 亚洲字幕AV一区二区三区四区| 亚洲色欲色欱wwW在线| 亚洲国产欧美一区二区三区| 含羞草国产亚洲精品岁国产精品| 国产精品久久久久久亚洲小说 | 亚洲精品无码久久毛片| 久久久久亚洲AV综合波多野结衣| 亚洲精品成人无码中文毛片不卡 | 成年女人午夜毛片免费看| 午夜高清免费在线观看| 免费中文字幕在线观看| 中文字幕亚洲不卡在线亚瑟| 亚洲va国产va天堂va久久| 亚洲综合色丁香麻豆| 国产精品高清视亚洲一区二区| 亚洲av乱码一区二区三区按摩 | 亚洲第一成年人网站| 国产午夜亚洲精品国产| 人妻仑刮八A级毛片免费看| a级精品九九九大片免费看| 亚洲精品在线免费观看视频| 在线看片人成视频免费无遮挡| 亚洲国产成人久久精品99| 亚洲国产无套无码av电影| 亚洲mv国产精品mv日本mv| 小说专区亚洲春色校园| 两个人看www免费视频| 国产又大又粗又长免费视频| 国产在线观看免费完整版中文版| 三上悠亚亚洲一区高清|