1. 程式人生 > 實用技巧 >Java進階之集合框架

Java進階之集合框架

Java進階之集合框架

Java進階之集合框架

Collection 單一元素儲存

    • List 有序(新增順序)可重複
      • 泛型:即“引數化型別”。就是將型別由原來的具體的型別引數化,類似於方法中的變數引數,此時型別也定義成引數形式(可以稱之為型別形參),然後在使用/呼叫時傳入具體的型別(型別實參)。泛型只能儲存引用型別
      • 自動裝包和自動拆包:在執行期間可以將一個基本資料型別中的數值型別自動轉換成為封裝類,也可以將一個封裝類自動轉換成一個基本資料型別中的數值型別
      • 元素固定的時候要選擇陣列陣列:減少多餘空間浪費
      • ArrayList(陣列列表)
        • ArrayList是List介面的大小可變陣列的實現
        • 集合的操作行為
          • 新增: list.add(內容)
          • 刪除全部: list.clear()
          • 刪除: list.remove(下標,下標或內容)
          • 插入: list.add(下標,內容)
          • 並集操作: list.addAll(list1) 將list1插入到list的後面
          • 插入集合: list.addAll(下標,list1)
          • 查詢: list.contains(內容)
          • 獲取大小: list.size()
          • 獲取元素: list.get()
          • 遍歷: 可以使用常規for或foreach{for(String s : list)}
        • 陣列到達邊界長度後,建立一個新陣列,然後將舊元素複製到新陣列中
        • 演算法擴容機制 1.5倍+1 初始為10
        • 如果遇見元素是可以變化長度的,優先使用ArrayList,如果元素長度是固定的,優先使用陣列
      • LinkedList(連結串列)
        • 連結串列-線性表
          • 單向線性列表
          • 單向環狀列表
          • 雙向線性列表
          • 雙向環狀列表
        • 除某些特殊方法以外,和ArrayList相差不大
        • 指向下一個.next
        • 指向上一個.previous
        • JDK1.6為雙向環狀連結串列,JDK1.7以後,是雙向線性連結串列
        • pop()模擬彈棧
        • push()模擬壓棧
        • 操作優勢和劣勢
          • 優點:插入(add),刪除效率高(remove)
          • 缺點:修改(set),查詢contains),獲取(get),遍歷()
          public
A(){ private next = next; private previous = previous; public void main(String[] args){ A1.next = A2; A2.previous = A1; A2.next = A3; A3.previous = A2; A3.next = A1; A1.previous = A3; } } //雙向環狀連結串列

      • 如果遇見插入和刪除操作比較頻繁的時候,適用LinkedList,如果查詢,修改操作比較頻繁時,適用ArrayList
      • Vector(向量)
        • 執行緒安全StringBuilder
        • Vector基於陣列,遍歷速度很快
      • Stack(棧結構)
        • push()壓棧-執行方法,方法進棧
        • pop()彈棧-方法執行完畢,方法出棧
        • 先進後出,後進先出
    • Set 無序(不遵循新增順序)無重複
      • HashSet(hash表)
        • add()新增的時候是無序的,不遵循新增順序
      • 集合的交叉並集
        • 並集:addAll() 保留所有元素,重複的保留一份
        • 交集:retainAll() 保留以A為基礎,在B中有相同的元素。
        • 差集:removeAll() 保留以A為基礎,在B中沒有相同的元素
      • Collections集合工具類
        • Collection.shuffle(list) 洗牌
        • max,min......(API)
      • HashSet集合儲存自定義類,如果希望物件之間互相覆蓋,必須重寫物件下equals和hashCode
      • 重寫的依據
        • 兩個物件呼叫equals,結果為 比較依據(兩個物件name屬性值相同則equlas為true)
        • 並且呼叫hashCode得到相同的返回值返程覆蓋,如果equals為true,儘量保證hashCode相同,反之儘量不同
        • 比較地址、比較型別instanceof、比較值
      • Java - Hash表核心演算法
    static iNt indexFor(int h,int length(陣列的長度)){
            return h & (length-1);
        }

      • 得到的結果一定不會超過陣列的最大索引
      • 在某些極端情況下,比如00001000和11110111按位計算會出現00000000情況
      • 在HashSet中,載入因子越大,產生哈西衝突可能性越大,載入因子越小,空間浪費就越嚴重。預設載入因子為0.75
    • TreeSet<(樹)
      • add()
      • 返回此集合最小元素或等於給定元素,如果沒有返回null:ceiling()
      • 拷貝:clone()
      • 刪除全部:clear()
      • HashSet覆蓋使用equals和HashCode,TreeSet覆蓋使用compareTo
      • 獲取全部的key:map.keySet() -- 可以遍歷輸出全部的key
      • 獲取全部的值:map.values()

Map key-value鍵值對

  • HashMap
    • 新增:put()
    • 刪除:remove()
    • 獲取大小:size()
    • 獲取值:get()
    • 鍵相同會覆蓋
    • HashSet不會出現覆蓋效果,後新增的元素不會進入集合,HashMap後新增的元素的值會覆蓋前面的值
    • HashMap可以儲存null值(containsKey),也可以儲存null鍵 -- 允許null的存在,酌情使用
    • HashSet的底層用的就是HashMap的key,如果Map的key是自定義的類,那麼久等效於HashSet儲存了自定義的類,即需要key所表示的類重寫equals和hashCode
  • TreeMap
    • TreeMap如果key是自定義的類,要求該類實現Comparable介面,並且重寫compareTo方法
  • Hashtable
    • Hashtable是執行緒安全的,不允許null鍵和null值

JUC 併發程式設計集合

  • JUC 指的是 java.util .concurrent 工具包。這是一個處理執行緒的工具包,在此包中增加了在併發程式設計中很常用的工具類,用於定義類似於執行緒的自定義子系統、包括執行緒池、非同步 IO 和輕量級任務框架,還提供了設計用於多執行緒上下文中的 Collection 實現等
  • 併發和並行的區別
    • 併發是指CPU一核心,模擬出多條執行緒,快速交替執行,多條執行緒操作同一個資源
    • 並行是指CPU多核心,多個執行緒可以在同一時間同時進行,多個人並排一起行走
  • 併發程式設計的本質:充分利用CPU的資源
  • 執行緒的幾種狀態
    • 新生
    • 執行
    • 阻塞
    • 等待
    • 超時等待
    • 終止
  • 具體請轉到多執行緒隨筆