陣列:陣列長度在初始化的時候就已經固定,不適合物件數量未知的情況。
下圖為collection(**於的部落格)
下圖為map(**於網路)
1.介紹一下list比較常用的集合:(有序,值允許重複)
1)arraylist:
底層實現:
初始化方法初始化了乙個陣列,底層實現為陣列。既然是陣列,了解下如何實現陣列長度的自動化增長。private static final object defaultcapacity_empty_elementdata = {};
transient object elementdata; // non-private to simplify nested class access
public arraylist()
int newcapacity = oldcapacity + (oldcapacity >> 1);
最關鍵的一句**,差不多就是一次增加原有長度的一半,當然還有其他特殊情況的處理,就不詳細說了。
特點:末尾新增/刪除資料時速度較快,向中間set/remove資料較慢,隨機查詢效率很高(因為有索引)。
2)linkedlist:
底層實現:
從上圖可以看出來是鍊錶,因為有next和prev所以是雙向鍊錶。private static class node
}
下面是remove方法的實現**
用遍歷來實現,效率肯定低,資料越多效率越低。public int indexof(object o)
} else
}return -1;
}
3)vector
底層實現:和arraylist一樣是陣列,不過vector所有方法上都有synchronized保證其執行緒安全。
特點:執行緒安全,效率低。
2.簡單介紹下set:(hashset無序,不允許有重複值)
hashset:基於hashmap實現,只儲存值,沒有key(map中key的位置放置值,value位置放置乙個new object())
hashset與hashmap的區別:hashmap中keys的元素有校驗重複,所以hashset中儲存的物件都會先校驗下hashcode。
linkedhashset:基於linkedhashmap實現,保證了元素的有序。
treeset:基於treemap實現,保證有序。
3.簡單介紹下queue:
deque:雙向佇列,deque是個介面,實現類有arraydeque(底層實現為陣列),linkeddeque(底層實現為鍊錶)。總體來說,arraydeque要比linkeddeque效能高。
priorityqueue:優先順序佇列,底層實現也是陣列,優先順序排序,需要實現comparator(排序方法暫未了解)。
4.另乙個基本介面map
1)hashmap:底層實現為雜湊表,所以儲存陣列不能保證有序。原始碼如下:
transient node table;
在呼叫put方法時,會判斷table是否為null,如果為null則進行初始化。下邊是預設初始化大小:
static final int default_initial_capacity = 1 << 4; // aka 16
當每次陣列存滿時,當前陣列容量小於最大數量(2^30)並且大於初始化容量時,陣列容量*2,增加的量如下:
hashmap的keys不允許有重複,可以為null,利用hashcode校驗keys是否重複,**如下;if (oldcap > 0)
else if ((newcap = oldcap << 1) < maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr << 1; // double threshold
}
static final int hash(object key)
2)hashtablehashtable在hashmap的基礎上所有方法都加上了synchronized關鍵字。並且在讀寫操作中限制了key不能為null,否則丟擲空指標異常。
3)linkedhashmap
4)treemap基於紅黑樹實現的,該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的 comparator 進行排序。不能夠記錄存入順序。static class entryextends hashmap.node
}
紅黑樹屬於平衡二叉樹的一種,資料在存入的時候,會根據資料大小進行排序,即左子節點《根節點《右子節點,所以在查詢元素的時候,可以直接和根節點進行比較,如果小於根節點,則向左查詢,如果大於根節點,則向右查詢,所以查詢效率比較高。下邊是紅黑樹的乙個圖:
(**於:
關於紅黑樹的右旋和左旋,請移步至:
資料結構 集合
乙個識別符號 集合set 可以儲存多個資料,資料不能重複。集合與陣列的區別,集合的內容具有唯一性 全等匹配 宣告集合 let f70 newset f71 集合賦值 let f71 let f70 newset f71 集合賦值 f70.add 1 f70 add 2 f70.add 1 f70 a...
集合和資料結構
類似的資料在作為集合而儲存和操作時通常可以得到更高效地處理。可使用 system.array 類或 system.collections system.collections.generic system.collections.concurrent 和 system.collections.imm...
資料結構 集合類
2 linkedlist 3 hashmap 4 hashtable arraylist初始長度為0,當第一次呼叫add後,長度變為10,當陣列首次擴容的10個空間用完需要擴容後,會第二次走grow方法來擴容 每次擴容為1.5倍 它的底層是用陣列實現的,所以查詢速度相對linkedlist要快。li...