java中的集合

物理結構:java

  • 順序存儲結構
  • 鏈式存儲結構

邏輯結構算法

  • 線性結構:通常線性表、棧、隊列、字符串、數組、廣義表
  • 非線性結構:樹、圖

一、集合命名規則數組

  • 命名大致上能夠歸類爲AbEf的形式: Ab表明物理結構,Ef表明邏輯結構
  • 如ArrayList,就是用數組實現線性表
  • LinkedList就是用鏈表實現的線性表

二、native方法:安全

  • arraycopy()@java.lang.System.class
  • 將src中的srcPos~srcPos+length-1的數據複製到dest中的destPos~destPos+length-1位置處 ​
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

三、順序存儲結構:ui

(1)線性表&棧線程

ArrayList:指針

  • 內部存儲了一個Object[]
  • 提供隨機訪問
  • ArrayList中數據的移動大可能是利用System.arraycopy()方法實現,該方法是native方法;
  • 擴容;
    • 默認大小是10;
    • 最大容量Integer.MAX_VALUE - 8;
    • 擴容觸發條件:當前要求容量大小大於當前容量大小
    • 正常擴容newCapacity = oldCapacity + (oldCapacity >> 1);
    • 使用System.arraycopy將數據所有移動到新的數組中
  • 縮容:手動調用trimToSize()方法,會縮到當前數組實際存儲的數據大小

Vector:code

  • Vector與ArrayList共同點
    • 二者實現的功能相同,方法的實現也基本一致;
    • 都具備SubList內部類和Itr迭代器內部類
    • 都可以擴容和縮容
  • Vector與ArrayList區別:
    • 線程安全:Vector對大部分的方法使用了關鍵字Synchronized聲明
    • 額外的%element%方法:這些方法會被Stack類所使用;

Stack:對象

  • Stack主要使用的是Vector<E>的方法進行具體的實現,自身沒有狀態量
  • 線程安全:繼承Vector,故也是線程安全的
  • pop方法:使用elementAt+removeElementAt
  • push方法:使用addElement
  • search方法:從後往前搜索調用lastIndexOf

(2)隊列繼承

ArrayDeque:

  • 存儲有一個Obejct[]數組;數組長度必須是2的冪次,由於這樣就方便取餘運算;
  • 有一個head和tail指針;
  • tail =(tail+1)&(elements.length-1)
  • head =(head+1)&(elements.length-1)
  • size = (tail-head)&(elements.length-1)
  • 擴容:
    • 正常擴容後大小爲原數組長度2倍
    • 利用System.arraycopy方法實現

PriorityQueue:

  • 類中存儲有一個Object[]數組
  • size爲當前數組中存儲的數據的大小
  • 存入的數據類型要求實現了Comparable接口
  • 數據的添加和刪除操做伴隨着調堆的操做;
  • 具備擴容功能:
    • 擴容大小:當前大小的2倍或者1.5倍
    • 擴容條件:準備存入的數據量大於當前Obejct數組的長度;

(3)Map

HashMap:

  • 內部存儲了一個Node<K,V>[] table;
  • 內部有定義一個Node內部類和TreeNode內部類
  • 後者是一顆紅黑樹
  • 數組的下標(散列值)等於hash(key)&n-1
  • 會自動擴容:
    • 默認大小是16;大小必須爲2的冪
    • 最大容量是1<<30
    • 填裝因子爲0.75
    • 擴容觸發條件:一旦當前存儲數據大於門限(容量*填裝因子)
    • 正常擴容newCapacity = oldCapacity<<1
    • 每一個桶中的數據分紅兩撥一波繼續留在原散列值下面
    • 另外一波移動到原散列值+oldCapacity位置處
  • 不能自動減容
  • 紅黑樹的利用:
    • 桶中的元素大於某個固定值,則將該桶中的數據由鏈表存儲結構,轉換成紅黑樹存儲結構
    • 在此以後的全部操做交由紅黑樹進行處理
    • 在擴容的時候,對紅黑樹進行拆分的過程當中
    • 若是最後元素個數小於固定值,則將紅黑樹存儲結構轉換爲普通鏈表存儲結構

HashTable:

  • 基本與HashMap相似;
  • 線程安全:HashTable的大部分方法使用了Synchronized關鍵字進行標記
  • 沒有紅黑樹:HashTable對桶中數據的存儲沒有使用紅黑樹,所以效率相對於hashmap會差一點
  • 不支持存儲null:會拋出異常

HashSet:

  • 內部存儲了一個HashMap<E,Object>變量
  • 一個簡單版本的HashMap
  • 只使用了key而沒有使用value部分,value永遠存的都是固定的Object

(4)String

String

  • 內部存儲的是一個final char[]字符數組;
  • 所以不能修改它指向的字符數組

StringBuidler

  • 內部存儲的是一個char[]字符數組
  • 所以能夠修改裏面的字符
  • 對於數組的拷貝大多依賴於System.arraycopy的方法
  • 擴容
    • 默認大小爲16
    • 容量最大值:Integer.MAX_VALUE
    • 正常狀況擴容大小:int newCapacity = value.length * 2 + 2;
    • 擴容觸發條件:準備存儲的字符數大於當前數組的長度
  • 縮容:
    • 爲當前存儲數據的大小

StringBuffer

  • 與Stringbuilder相似
  • 線程安全:方法大多使用了Synchronized關鍵字標記

四、鏈式存儲結構

TreeMap:

  • 定義了一個內部類Entry<K,V>
  • 該節點定義了這課紅黑樹的存儲結構
  • 存儲有該樹的根節點
  • 要刪除這顆樹只須要將root指向null便可
  • GC以後便會回收該紅黑樹,形成其它節點的引用不可達
  • 每次插入、刪除一個樹中節點時
  • 都須要對這顆紅黑樹進行必定的調整

TreeSet:

  • 內部存儲了一個TreeSet<E,Object>對象
  • 一個簡單版本的TreeMap
  • 只使用了key而沒有使用value部分,value永遠存的都是固定的Object

LinkedList:

  • 內部存儲一個雙向鏈表
  • 全部的操做都是對該鏈表進行操做 

LinkedHashMap:

  • 數據存儲是HashMap只是有在其上面加了一個鏈表結構
  • 每次對該HashMap中的數訪問一次都會改變鏈表結構
  • 保證鏈表中的最後面的數據是最近剛被訪問的那個節點的數據
  • 具備LRU算法特性(Least recently used,最近最少使用)
相關文章
相關標籤/搜索