標籤:code dict 而不是 .net htm span 操作 返回 detail
ArrayList與LinkedList聯絡與區別:
二者都實現List介面。
1> ArrayList是實現基於動態數組的資料結構;LinkedList實現的是鏈表的資料結構。
2> 對於隨機訪問Get和Set,ArrayList優於LinkedList,因為LinkedList要移動指標;
3> 對於新增和刪除add、remove,LinkedList優於ArrayList,因為要移動資料;
可以這樣說:當操作是在一列資料的後面添加資料而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的效能;當你的操作是在一列資料的前面或中間添加或刪除資料,並且按照順序訪問其中的元素時,就應該使用LinkedList了。
HashMap原理:
一般的資料存放區物理結構有兩種:順序儲存和鏈式儲存。順序儲存的優勢在於快速的尋找,鏈式儲存的優勢在於新增和刪除。為了打破二者的尷尬,HashMap就應運而生了。
HashMap的主幹是一個Entry數組。Entry是HashMap的基本組成單元。Entry是HashMap中的一個靜態內部類。
HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要為瞭解決雜湊衝突而存在的,如果定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於尋找,添加等操作很快,僅需一次定址即可;如果定位到的數組包含鏈表,對於添加操作,其時間複雜度依然為O(1),因為最新的Entry會插入鏈表頭部,急需要簡單改變引用鏈即可,而對於尋找操作來講,此時就需要遍曆鏈表,然後通過key對象的equals方法逐一比對尋找。所以,效能考慮,HashMap中的鏈表出現越少,效能才會越好。
Put:
key -> hash(key) -> indexFor(hash(key)): 如果該對應資料已存在,執行覆蓋操作。用新value替換舊value,並返回舊value. 否則執行addEntry(hash, key, value, i);
Get:
public V get(Object key) { //如果key為null,則直接去table[0]處去檢索即可。 if (key == null) return getForNullKey(); Entry<K,V> entry = getEntry(key); return null == entry ? null : entry.getValue(); }
final Entry<K,V> getEntry(Object key) { if (size == 0) { return null; } //通過key的hashcode值計算hash值 int hash = (key == null) ? 0 : hash(key); //indexFor (hash&length-1) 擷取最終數組索引,然後遍曆鏈表,通過equals方法比對找出對應記錄 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 != null && key.equals(k)))) return e; } return null; }
get方法的實現相對簡單,key(hashcode)-->hash-->indexFor-->最終索引位置,找到對應位置table[i],再查看是否有鏈表,遍曆鏈表,通過key的equals方法比對尋找對應的記錄。
參考:http://www.cnblogs.com/chengxiao/p/6059914.html#t1
HashMap與HashTable的區別:
1> 所繼承的類不同,HashMap繼承AbstractMap ,而HashTable繼承Dictionary ;
2> HashMap線程不安全,方法是不同步的,HashTable線程是安全的,方法同步;
3> HashMap允許Null的K,V,而HashTable不允許;
總體來說,HashMap的效率要比HashTable高一些,通常會優先考慮使用。
參考:http://blog.csdn.net/java2000_net/article/details/2512510
Java 知識點