淺入淺出Java集合之Collection

筆者思維導圖,闡述順序以此爲基準,詳細其原理和結構。

一、數據結構的概念

    研究數據的邏輯結構和物理結構以及它們之間的相互關係,並對這種結構定義相應的運算規則,而且確保經過運算後得到的新結構依然是原來的結構類型。

  1. 數據:所有能被輸入到計算機中,且能被計算機處理的符號的集合,是計算機操作對象的總稱。
  2. 數據元素:構成數據的基本單位,在程序中通常作爲一個整體。
  3. 數據項:構成數據元素的基本單位,也是數據結構中的最小單位。
  4. 數據對象:性質相同的數據元素的集合,是數據的一個子集。

    例如:學校作爲一臺計算機,所有入住的學生、老師、管理人員及其工作人員等 處於數據層次,而數據的基本單位是學生、老師、管理人員和工作人員,數據項則代表學生中學號、姓名、系別等。由此,數據對象可以抽象代表爲學生這一類的集合。

二、時間複雜度:

 指執行算法所需要的工作量,即執行每條程序語句的次數乘以執行時間,常用英文大寫O符號表述。

場景演示(計算1+...+100的兩種方法的時間複雜度):

for (int i=1; i<=n; i++){ 
      sum+=i;//執行n次
}  
for (int i=0; i<=n; i++){ 
     sum+=(1+n)*n/2; // 執行1+n/2次
}  

        即上述例子的函數關係式分別爲:f(n)=n、f(n)=1+n/2

        時間複雜度分別爲:O(n)、O(n/2)。批註:f(n)=1+n/2隨着n漸大,可忽略不計

三、空間複雜度:

  若輸入數據所佔空間只取決於問題本身,和算法無關,則只需要分析除輸入和程序之外的輔助變量所佔額外空間。

場景演示(計算數組逆序兩種方法的空間複雜度):

for(int i=0,length=array.size();i<length;i++){
       tempArray[i]=array[length-i-1];//空間複雜度爲一個 tempArray數組
}
for(int i=0,length=array.size();i<length;i++){
       int temp=array[length-i-1];
       array[lenth-i-1]=array[i];
        array[i]=temp;//空間複雜度爲一個整型變量temp
}
四、集合框架的概念:

    一個代表、操作集合的統一架構,包含以下幾點:

  • 接口:表示集合的抽象數據類型,允許操作集合時不必關注具體實現,從而達到“多態”,且對實現類具有一定約束規則。
  • 實現類:集合接口的具體實現,是重用性很高的數據結構。
  • 算法:根據需要對實現類中的對象進行計算,比如查找、排序等,重用性高。
五、集合框架的優點:
  •  敏捷編碼:集合框架提供了方便的數據結構和算法,無需關心物理結構,直接應用上層業務
  • 高效、健壯、可行:數據結構和算法的性能經過幾次升級與迭代,棒棒噠。
  • 穩定:標準的集合框架,頂層定義了基礎方法,且基本固定,只需具體實現 ,不但節省學習成本,還不用操心架構設計。
六、集合框架脈絡圖:

七、Collection集合中的方法:

八、集合的基礎操作:
  • int size(): 獲取數據元素個數
  • boolean isEmpty():判斷集合中是否存在數據元素
  • boolean contains(Object element):判斷集合中是否包含指定數據元素
  • boolean add(E element):添加數據元素或者其子類(E表示可接受本身和其子類
  • boolean remove(Object element):刪除元素
  • Iterator<E> iterator():獲取迭代器
九、操作集合的方法:
  • boolean containsAll(Collection<?> c): 是否包含指定集合 c 的全部元素,集合c是Collection集合的實現類或者子類
  • boolean addAll(Collection<? extends E> c): 追加集合 c 中的全部元素,數據元素可以是本身或者其子類
  • boolean removeAll(Collection<?> c): 刪除兩集合多個匹配的元素
  • boolean retainAll(Collection<?> c): 保留兩集合多個匹配的元素
  • void clear(): 移除全部的數據元素
十、操作數組的方法:
  • Object[] toArray(): 返回全部的數據元素存入Object數組
  • <T> T[] toArray(T[] a): 返回一個包含集合中所有元素的數組,運行時根據數組元素的類型決定返回時數組類型
十一、迭代器:
    迭代器模式:提供一種方法對一個容器對象中的各個元素進行訪問,而又不暴露該對象容器的內部細節。
List<String> list = new ArrayList<String>();      
for(int i = 0 ; i < list.size() ;  i++){
   String string = list.get(i);//內部訪問細節
}
   針對此種方式,由於知道其內部結構,訪問代碼與集合本身緊密耦合,不同的集合對應不用的遍歷方法,使得客戶端與集合類代碼無法分離,相當麻煩。如此,Iteratort提供同一種邏輯訪問集合方式,使得客戶端無需知道集合內部結構,從而達到遍歷集合的目的。
package java.util;
public interface Iterator<E> {
    boolean hasNext();//判斷是否存在下一個對象元素
    E next();//獲取下一個元素
    void remove();//移除元素
}
    Iterator遍歷過程中移除數據元素的問題:由於在你迭代之前,迭代器已經被通過list.itertor()創建,在後續的迭代過程中,又針對list進行增加、刪除等操作,那麼Iterator根據其失效機制拋出異常。因爲Iterator對象已經無法主動同步list做出的改變,默認爲操作是線程不安全的,從而拋出ConcurrentModificationException異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章