1. 程式人生 > >集合與數組

集合與數組

包裝 數組結構 通過 back 遍歷集合 類型檢查 簡單 each 無序

首先我們先來看概念

  數組:用來存放對象的一種容器(可以存儲基本數據類型),長度固定,不適合對象數量未知的情況下使用。

  集合:可以存放多種對象類型的容器(只能存儲對象),長度可變。

數組與集合的區別

  1、數組聲明了數據類型,然後就只能存儲那一種數據類型。集合能存放多種(不加泛型時,類型是Object)。

  2、數組是靜態的,一個數組實例具有固定的大小,一旦創建了就無法改變容量了。集合是動態擴展容量的,可以根據需要動態改變大小。

  3、數組是java語言中內置的數據類型,是線性排列的,執行效率或類型檢查都是最快的。

集合只能存放對象,基本數據類型如何解決?

  可以通過包裝類把基本數據類型轉為對象類型,存放引用。因為有了自動裝箱和自動拆箱功能,想把數據類型存入集合,直接存就可以了。系統會自動將其裝箱成封裝類,然後放入集合。(未指定泛型的話,集合中拿出來的都是Object類型)

所以用數組的原因是數組比集合快嗎?用集合的原因是能存放多種類型對象?

  一般用 ArrayList 比較多,它基於數組,又實現了Collection和List接口。可以說是綜合了這兩個。

集合類體系

單列集合

Collection
├List (有序集合,允許相同元素和null)
│├LinkedList (非同步(線程不安全),允許相同元素和null,增刪快查改慢)
│├ArrayList (非同步(線程不安全),允許相同元素和null,實現了動態大小的數組,增刪慢查改快)
│└Vector(同步(線程安全),允許相同元素和null,效率低)
│ └Stack(繼承自Vector,實現一個後進先出的堆棧)
└Set (無序集合,不允許相同元素,最多有一個null元素)

|-HashSet(無序集合,不允許相同元素,最多有一個null元素)

雙列集合
Map (沒有實現collection接口,key不能重復,value可以重復,一個key映射一個value)
├Hashtable (實現Map接口,同步(線程安全),不允許null作為key和value,用自定義的類當作key的話要復寫hashCode和eques方法,)
├HashMap (實現Map接口,非同步(線程不安全),允許null作為key和value,用的多)
└WeakHashMap(實現Map接口)

Collection接口是集合類的根接口,Java中沒有提供這個接口的直接的實現類。但是卻讓其被繼承產生了兩個接口,就是Set和List。Set中不能包含重復的元素。List是一個有序的集合,可以包含重復的元素,提供了按索引訪問的方式。 

  Collection和Collections的區別 Collection是集合類的上級接口,繼承與他有關的接口主要有List和Set Collections 是一個包裝類,它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。

Map是Java.util包中的另一個接口,它和Collection接口沒有關系,是相互獨立的,但是都屬於集合類的一部分。Map包含了key-value對。Map不能包含重復的key,但是可以包含相同的value。

Iterator,所有的集合類,都實現了Iterator接口,這是一個用於遍歷集合中元素的接口。(使用 for / foreach 循環遍歷的時候不能刪除集合元素)

  主要包含以下三種方法:

    ①.hasNext()是否還有下一個元素。
    ②.next()返回下一個元素。
    ③.remove()刪除當前元素。

  Iterator 和 ListIterator 的區別是什麽?

    Iterator 可以用來遍歷 Set 和 List 集合,但是ListIterator 只能遍歷 List 。

    Iterator 對集合只能是前向遍歷,ListIterator 可以前向也可以後向。

    ListIterator 實現了 Iterator 接口。並且擴展了其他功能(如:增加元素,替換元素,獲取前一個後一個元素索引等)

1、List(有序、可重復)
List裏存放的對象是有序的,同時也是可以重復的,List關註的是索引,擁有一系列和索引相關的方法,查詢速度快。因為往list集合裏插入或刪除數據時,會伴隨著後面數據的移動,所有插入刪除數據速度慢。

  ArrayList和LinkedList的區別

    LinkedList經常用在增刪操作較多而查詢操作很少的情況下,ArrayList則相反。

    LinkedList是鏈表結構,查詢的時候是移動指針一個個找過去的,比較慢;而增加只需要連接上去就可以了。

    ArrayList是數組結構,查詢是根據索引隨機查詢的,比價快;而增刪需要更新索引,所以比較慢。

    若只對單條數據插入或刪除,ArrayList的速度反而優於LinkedList。但若是批量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 因為ArrayList每插入一條數據,要移動插入點及之後的所有數據。

2、Set(無序、不能重復)
Set裏存放的對象是無序,不能重復的,集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中。

  set是如何不能加入重復值的?

    set 的 add() 方法底層是 map.put(key,value) 方法,我們添加進來的對象放在 map 中 key 的位置

    而 map 的 key 是不能重復的。這裏靠的是重寫了 hashCode() 和 equals() 方法。

3、Map(鍵值對、鍵唯一、值不唯一)
Map集合中存儲的是鍵值對,鍵不能重復,值可以重復。根據鍵得到值,對map集合遍歷時先得到鍵的set集合,對set集合進行遍歷,得到相應的值。

  HashTable與HashMap
    同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的。
    HashMap允許存在一個為null的key,多個為null的value 。
    hashtable的key和value都不允許為null。

最後我們再重點講一下 ArrayList

  它其實就是動態數組,提供了動態的增加和減少元素

  實現了Collection和List接口,可以靈活的設置數組的大小。

  線程不安全,因此一般建議在單線程中使用ArrayList。

  ArrayList是基於數組的,長度是固定的(沒設置的時候默認是10),如果要填充的數據超出了長度會怎麽辦? 答:ArrayList會增加長度,底層會創建一個新的數組,長度是newLength = oldLength + oldLength/2,如果初始值是10,那麽依次是15,22,33,49,73......

集合與數組