sincerit java基礎之集合
引用這些部落格的圖:
https://www.cnblogs.com/LittleHann/p/3690187.html
為什麼要學習集合呢?
java的集合相當於c語言的資料結構,對資料的儲存方式也很重要。
有一句話在網上看到的:資料多了用物件儲存,物件多了用集合儲存
所以集合是用來儲存物件的。
List和陣列類似,可以動態增長,根據實際儲存的資料的長度自動增長List的長度。查詢元素效率高,插入刪除效率低,因為會引起其他元素位置改變 <實現類有ArrayList,LinkedList,Vector>
集合類都位於java.util包下。
那集合包含些什麼呢?
從上面可以看出分成了兩個類別: 一個是Collection(集合) ,另一個是Map, 當然這兩個類都還是介面類,具體類還在下面,而分成這樣的依據是:
Collection:一個一個元素的儲存, 比如List, set…
Map: 以key/value方式儲存
介面類:
Collection(其子類介面):
- List介面能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似於陣列的下標)來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素,動態增長
- Set不能有重複元素
- Queue保持一個佇列(先進先出)的順序
Map:
- SortedMap 繼承於 Map,使 Key 保持在升序排列
抽象類:
AbstracCollection
AbstractList
AbstractSet
AbstractSquentialList
AbstractMap
具體類:
實現List
ArrayList底層是以陣列的形式實現,查詢很快但刪除插入很慢
LinkedList底層是以連結串列的形式實現,刪除插入較快但查詢很慢
實現Set介面的有:HashSet、LinkedHashSet、TreeSet
HashSet底層是以hash table的形式實現
LinkedHashSet底層以連結串列的形式實現
TreeSet底層以紅黑樹的形式實現
實現Queue介面的有:PriorityQueue、LinkedList、ArrayQueue
PriorityQueue底層是以二叉堆的形式實現
LinkedList底層是以連結串列的形式實現
ArrayQueue底層是以陣列的形式實現
實現Map介面的有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap
EnumMap底層以陣列的形式實現
IdentityHashMap,HashMap,WeakHashMap底層以hash table的形式實現
LinkedHashMap底層以連結串列的形式實現
TreeMap底層以紅黑樹的形式實現
集合演算法Collections(工具類) : 提供了對集合進行排序,遍歷等多種演算法實現。
排序操作,查詢替換操作,同步控制
具體類的程式碼實現(常用的):
ArrayList:
import java.util.*;
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
//第一種遍歷方法使用foreach遍歷List
for (String str : list) { //也可以改寫for(int i=0;i<list.size();i++)這種形式
System.out.println(str);
}
//第二種遍歷,把連結串列變為陣列相關的內容進行遍歷
String[] strArray=new String[list.size()];
list.toArray(strArray);
for(int i=0;i<strArray.length;i++) //這裡也可以改寫為 foreach(String str:strArray)這種形式
{
System.out.println(strArray[i]);
}
//第三種遍歷 使用迭代器進行相關遍歷
Iterator<String> ite=list.iterator();
while(ite.hasNext())//判斷下一個元素之後有值
{
System.out.println(ite.next());
}
}
}
HashMap:
import java.util.*;
public class Test{
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一種:普遍使用,二次取值
System.out.println("通過Map.keySet遍歷key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二種
System.out.println("通過Map.entrySet使用iterator遍歷key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三種:推薦,尤其是容量大時
System.out.println("通過Map.entrySet遍歷key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四種
System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}