java集合

java_basic

list

List以線性方式存儲元素,集合中可以存放重復對象,元素有序。
最常用實現(xiàn)類:

ArrayList:隨機訪問元素快,增刪元素慢。
Vector:Vector與ArrayList相似。但Vector的方法是線程安全的,而ArrayList的方法不是,
        由于線程的同步必然要影響性能,因此ArrayList的性能比Vector好。
LinkedList:隨機訪問元素慢,順序訪問快,增刪元素快。
Stack:棧,繼承Vector,特點是先進后出(FILO, First In Last Out)。

set

Set不保存重復的元素。Set與Collection有完全一樣的接口。Set接口不保證維護元素的次序。
最常用實現(xiàn)類:

HashSet : 隨機查找快。存入HashSet的對象必須定義hashCode()。HashSet查找某個對象時,
          首先用hashCode()方法計算出這個對象的Hash碼,然后再根據(jù)Hash碼到相應的存儲區(qū)域用equals()方法查找,從而提高了效率。
TreeSet : 保存次序的Set, 底層為樹結構。使用它可以從Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查詢速度,且內(nèi)部使用鏈表維護元素的順序。于是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。

Map

Map 是一種把鍵對象和值對象映射的集合,它的每一個元素都包含一對鍵對象和值對象。 Map沒有繼承于Collection接口。
最常用的實現(xiàn)類:

HashMap:Map基于哈希表的 Map 接口的實現(xiàn)。
HashTable:hashtable和hashmap,從存儲結構和實現(xiàn)來講基本上都是相同的,最大的不同就是hashtable是線程安全的。
LinkedHashMap: LinkedHashMap是HashMap的一個子類,是Map接口的哈希表和鏈接列表實現(xiàn)。
               它維護著一個雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。
TreeMap : 基于紅黑樹的實現(xiàn)。

工具類

Iterator迭代器、ListIterator迭代器、Enumeration枚舉類、Arrays 和 Collections

Iterator迭代器:        迭代器是一個用來遍歷并選擇序列中的對象。Java的Iterator的只能單向移動。
ListIterator迭代器:    ListIterator是一個更加強大的Iterator的子類型。它只能用于各種List類的訪問。它最大的優(yōu)點是可以雙向移動。
Arrays:               Java.util.Arrays類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的。
Collections:          java.util.Collections是一個包含各種有關集合操作的靜態(tài)多態(tài)方法的工具類,服務于Java的Collection框架。

ArrayList Vector LinkedList Stack fail-fast

1   arraylist 主要是擴容
    
 private void grow(int minCapacity) {
        // 獲取當前數(shù)組的容量
        int oldCapacity = elementData.length;
        // 擴容。新的容量=當前容量+當前容量/2.即將當前容量增加一半。
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果擴容后的容量還是小于想要的最小容量
        if (newCapacity - minCapacity < 0)
            //將擴容后的容量再次擴容為想要的最小容量
            newCapacity = minCapacity;
        //如果擴容后的容量大于臨界值,則進行大容量分配
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData,newCapacity);
    }
 Iterator迭代器、ListIterator迭代器  都是快速失敗的 (fail-fast)

2   Vector

    Vector底層是數(shù)組。
    有序。Vector底層是數(shù)組,數(shù)組是有序的。
    可重復。數(shù)組是可重復的。
    隨機訪問效率高,增刪效率低。通過索引可以很快的查找到對應元素,而增刪元素許多元素的位置都要改變。
    線程安全。很多方法都是synchronized的。

3 fail-fast

    fail-fast 機制是java容器(Collection和Map都存在fail-fast機制)中的一種錯誤機制。在遍歷一個容器對象時,當容器結構被修改,
    很有可能會拋出ConcurrentModificationException,產(chǎn)生fail-fast。  

4   LinkedList

    LinkedList底層是雙向鏈表。
    有序。鏈表是有序的。
    元素可重復。鏈表元素可重復。
    隨機訪問效率低,增刪效率高。

    ArrayList與迭代器模式
    Vector與迭代器模式
    LinkedList與迭代器模式
    
5   棧 Stack  先進后出(FILO, First In Last Out) 

    public class Stack<E> extends Vector<E>
    它繼承Vector,并額外提供了push、pop、peek、empty、search這幾個方法。
    當stack被第一次創(chuàng)建時,它包含0個元素。
    Deque接口和它的實現(xiàn)是更強大的先進先出的棧的實現(xiàn)。
    
總結:

List以線性方式存儲元素,集合中可以存放重復對象,元素有序。

最常用實現(xiàn)類:
ArrayList:隨機訪問元素快,增刪元素慢。
Vector:Vector與ArrayList相似。但Vector的方法是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能,因此ArrayList的性能比Vector好。
LinkedList:隨機訪問元素慢,順序訪問快,增刪元素快。
Stack:棧,繼承Vector,特點是先進后出(FILO, First In Last Out)。
從上面List的各個實現(xiàn)類的特點不難得出以下結論:

需要快速插入刪除元素,應使用LinkedList
不需要快速插入刪除元素,需要快速隨機訪問元素
只有單個線程操作list,應使用ArrayList
有多個線程操作list,應使用Vector
Hashtable與HashMap不同點
不同點 HashMap Hashtable
數(shù)據(jù)結構 數(shù)組+鏈表+紅黑樹 數(shù)組+鏈表
繼承的類不同 繼承AbstractMap 繼承Dictionary
是否線程安全
性能高低
默認初始化容量 16 11
擴容方式不同 原始容量x2 原始容量x2 + 1
底層數(shù)組的容量為2的整數(shù)次冪 要求一定為2的整數(shù)次冪 不要求
確認key在數(shù)組中的索引的方法不同 i = (n – 1) & hash; index = (hash & 0x7FFFFFFF) % tab.length;
遍歷方式 Iterator(迭代器) Iterator(迭代器)和Enumeration(枚舉器)
Iterator遍歷數(shù)組順序 索引從小到大 索引從大到小

Hashtable不建議在新代碼中使用,不需要線程安全的場合可以用HashMap替換,需要線程安全的場合可以用ConcurrentHashMap替換。

HashMap與LinkedHashMap比較

不同點:

不同點 HashMap LinkedHashMap
數(shù)據(jù)結構 數(shù)組+鏈表+紅黑樹 數(shù)組+鏈表+紅黑樹+雙向循環(huán)鏈表
是否有序 無序 有序

相同點:

都是基于哈希表的實現(xiàn)。
存儲的是鍵值對映射。
都繼承了AbstractMap,實現(xiàn)了Map、Cloneable、Serializable。
它們的構造函數(shù)都一樣。
默認的容量大小是16,默認的加載因子是0.75。
都允許key和value為null。
都是線程不安全的。
TreeMap與HashMap比較

不同點:

不同點 HashMap TreeMap
數(shù)據(jù)結構 數(shù)組+鏈表+紅黑樹 紅黑樹
是否有序
是否實現(xiàn)NavigableMap
是否允許key為null

增刪改查操作的時間復雜度 O(1) log(n)

相同點:

都以鍵值對的形式存儲數(shù)據(jù)。
都繼承了AbstractMap,實現(xiàn)了Map、Cloneable、Serializable。
都是非同步的。
實現(xiàn)類比較
實現(xiàn)類 數(shù)據(jù)結構 是否線程安全 key是否可為null 是否有序
HashMap 數(shù)組+鏈表+紅黑樹(since JDK1.8)
Hashtable 數(shù)組+鏈表
LinkedHashMap 數(shù)組+鏈表+紅黑樹(since JDK1.8)+ 雙重鏈接列表
WeakedHashMap 數(shù)組+鏈表+隊列
TreeMap 紅黑樹
內(nèi)部排序,至少掌握基礎算法如歸并排序、交換排序(冒泡、快排)、選擇排序、插入排序等。
外部排序,掌握利用內(nèi)存和外部存儲處理超大數(shù)據(jù)集,至少要理解過程和思路。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 原文地址 Java集合 Java集合框架:是一種工具類,就像是一個容器可以存儲任意數(shù)量的具有共同屬性的對象。 Ja...
    gyl_coder閱讀 1,041評論 0 8
  • 一、ArrayList和Vector的區(qū)別 共同點: 都實現(xiàn)了List接口繼承了AbstractList接口 底層...
    HikariCP閱讀 660評論 0 0
  • Collection & Map Collection 子類有 List 和 Set List --> Array...
    任教主來也閱讀 3,313評論 1 9
  • 1.List,Set,Map之間的區(qū)別 2.ArrayList與LinkedList的區(qū)別 Arraylist底層...
    惜小八閱讀 541評論 0 2
  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結構如棧,隊列等,Java集合還可以用于保存具有映射關...
    小徐andorid閱讀 2,091評論 0 13

友情鏈接更多精彩內(nèi)容