1. 程式人生 > >sincerit java基礎之集合

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(其子類介面):

  1. List介面能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似於陣列的下標)來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素,動態增長
  2. Set不能有重複元素
  3. Queue保持一個佇列(先進先出)的順序

Map:

  1. SortedMap 繼承於 Map,使 Key 保持在升序排列

抽象類:
AbstracCollection
AbstractList
AbstractSet
AbstractSquentialList
AbstractMap

具體類:
實現List

介面的有:ArrayList、LinkedList
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);
      }
     }
}