前言
- 在程式設計中,常常需要集中存放多個資料。從傳統意義上講,陣列是我們的一個很好的選擇,前提是我們實現已經明確知道我們將要儲存的物件的數量。
- 一旦在陣列初始化時指定了陣列長度,這個陣列長度就是不可變的,如果我們需要儲存一個可以動態增長的資料,在編譯時無法確定具體的數量,java的集合類就是一個很好的設計方案。
- 集合類概述:面對物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,Java就提供類集合類。
-
陣列和集合類都是容器,不同之處:
(1)陣列雖然也可以儲存物件,但長度是固定的;集合的長度是可變的。 (2)陣列中可以儲存基本資料型別,集合只能儲存物件。
- 集合類特點:集合只用於儲存物件,集合長度可變,集合可以儲存不同型別的物件。
- 集合類主要負責儲存、盛裝其他資料,因此集合類也被稱為容器類。
- 所有的集合類都位於java.util包下。
- 細數java集合,其中比較常見的就是List、Set、Map、和Queue,在這四者中,除了Map,其他三個介面都繼承於Collection。
Collection
- Collection介面概述:Collection層次結構中的根介面。
- Collection表示一組物件,這些物件也稱為collection的元素。
- 一些collection允許有重複的元素,而另一些不允許;一些collection是有序的,而另一些則是無序的。
-
成員方法:
(1)boolean add(E e) (2)boolean remove(Object o) (3)void clear() (4)boolean contains(Object o) (5)boolean isEmpty() (6)int size() (7)boolean addAll(Collection c) (8)boolean removeAll(Collection c) (9)boolean containsAll(Collection c) (10)boolean retainAll(Collection c) (11)把集合轉成陣列:Object[] toArray() (12)迭代器,集合的專用遍歷方式:Iterator iterator()
Collection之List介面
- 概述:有序的collection,也稱為序列。
- List介面在java集合類中充當的是一個元素有序、元素可重複的集合角色。
- 繼承於Collection集合,所以擁有Collection集合的所有方法。
- List集合也擁有屬於自己的方法:用來實現根據元素索引來操作集合元素的作用。
- 此介面的使用者可以對列表中的每個元素的插入位置進行精確的控制。
- 使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。
-
成員方法:
(1)void add(int index,E element) (2)E remove(int index) (3)E get(int index) (4)E set(int index,E element) (5)ListIterator listIterator()
常見的繼承List介面的實用類
-
ArrayList:
(1)基於陣列實現的List類,封裝了一個動態的、允許再分配的Object[]陣列 (2)ArrayList用initialCapacity引數來設定該陣列的長度,當長度超過預設值後,ArrayList會動態增加。 (3)ArrayList類是執行緒不安全的,如果要保證該集合的同步性,必須在程式中手動儲存。 (4)底層資料結構是陣列,查詢快,增刪慢 (5)執行緒不安全,效率高 (6)增刪慢也是在資料量較大的情況下,在資料量較小的情況下,ArrayList()不一定比LinkedList()方法慢。 (7)另外,ArrayList在末尾插入和刪除資料的話,速度反而比LinkedList要快。
-
LinkedList:
(1)底層資料結構是連結串列,查詢慢,增刪快。 (2)除了繼承List介面外,LinkedList介面也繼承了Deque介面,所以也可以當作棧和佇列(雙向)來使用。 (3)成員方法: 【1】public void addFirst(E e)及addLast(E e) 【2】public E getFirst()及getLast() 【3】public E removeFirst()及public E removeLast()
-
Vector:
(1)底層資料結構是陣列,查詢快,增刪慢 (2)Vector與Array List十分的相像,都是基於陣列實現的List類,也是封裝了一個動態分配的Object[]陣列,也可以使用initialCapacity引數來設定陣列的長度。 (3)Vector是執行緒安全的,因此效能差
-
Stack:
(1)Stack是繼承Vector的子類,它主要是用來模擬棧,因此也具備了peek()、pop()、push()等主要用於棧操作的方法。 (2)Stack也是執行緒安全的,因此效能差
-
使用List集合的建議:
(1)遍歷集合元素。ArrayList和Vector使用get()方法來獲取遍歷元素,LinkedList應該採用迭代器來遍歷集合元素。 (2)插入和刪除。當這類操作較多的時候,優先考慮使用LinkedList。 (3)多執行緒。當需要使用到多執行緒的ArrayList時,可以使用Collections將該集合類包裝成執行緒安全的集合。
Collection之Set介面
- 一個不包含重複元素的collection。
- Set介面是一個無序的、不可重複的集合。
- Set集合中加入資料元素時,Set集合通常不用記住元素的新增順序。
- 當兩個相同元素加入到一個Set集合中,則新增操作失敗。
常見的繼承Set介面的實用類
-
HashSet:
(1)按照hash演算法來儲存集合中的元素,因此具有良好的存取和查詢功能。 (2)無序的,非執行緒同步的,集合元素可以是null (3)HashSet集合儲存過程: 【1】當向HashSet集合中存入一個元素時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,然後根據該值決定該物件在HashSet中的儲存位置。 【2】如果有兩個元素通過equals()方法返回true,但他們的hashCode()方法返回值不相等,HashSet也會將其儲存在不同的位置。 【3】也就是說:HashSet的新增元素判斷標準是:兩個物件通過equals()方法比較相等,並且兩個物件的hashCode()方法返回值也相等。
-
LinkedHashSet:
(1)元素有序並且唯一。 (2)由連結串列保證元素有序。 (3)由雜湊表保證元素唯一。 (4)LinkedHashSet是繼承HashSet的子類。
-
TreeSet:
(1)使用元素的自然順序對元素進行排序。 (2)或者根據建立set時提供的Comparator進行排序。 (3)TreeSet是SortedSet介面的實現類,所以TreeSet可以確保集合元素處於排序狀態。 (4)TreeSet使用紅黑樹來維護集合元素的次序。如果實現comparator()方法,可以實現定製排序。如果採用自然排序,則返回null。
-
EnumSet:
(1)專為列舉類設計的集合類 (2)所有元素都必須是指定列舉型別的列舉值,該列舉型別在建立EnumSet顯式或隱式的指定。 (3)EnumSet在內部以位向量的形式儲存,十分緊湊高效,因此EnumSet物件佔用記憶體小,並且執行效率高 (4)該集合元素中不允許加入null元素。
Map介面
- 該介面無法繼承Collection介面,主要原因還是因為Map是用來儲存具有對映關係的資料。
- Map中儲存著兩組值。一組值用來儲存Map中的Key,另外一組用來儲存Map裡的value。
- 值得注意的是,Map中的Key不能重複,判斷標準是同一個Map物件的任何兩個Key通過equals方法比較總是返回false
-
成員方法:
(1)V put(K key,V value) (2)V remove(Object key) (3)void clear() (4)boolean containsKey(Object key) (5)boolean containsValue(Object value) (6)boolean isEmpty() (7)int size()
-
Map介面和Collection介面的不同:
(1)Map是雙列的,Collection是單列的 (2)Map的健是唯一的,Collection的子體系Set是唯一的 (3)Map集合的資料結構值針對健有效,跟值無關 (4)Collection集合的資料結構是針對元素有效的
常見的繼承Map介面的實用類
-
HashMap:
(1)執行緒不安全,並且HashMap中可以使用null作為key或者value (2)key是雜湊表結構,可以保證健的唯一性
-
LinkedHashMap:
(1)LinkedHashMap使用一個雙向連結串列來維護key-value對的次序 (2)LinkedHashMap是一個有序的Map集合,順序與key-value對的插入順序保持一致 (3)具有可預知的迭代順序
-
TreeMap:
(1)TreeMap是一個紅黑樹的結構,每個key-value作為紅黑樹的一個節點 (2)TreeMap也會對key進行排序,也分為自然排序和定製排序兩種 (3)健的紅黑樹結構,可以保重健的排序和唯一性
Iterator
- Iterator概述:對collection進行迭代的迭代器,依賴於集合而存在
- 凡是實現了Collection介面的集合類,都有一個Iterator方法,用於返回一個實現了Iterator介面的物件,用於遍歷集合。
-
成員方法:
(1)boolean hasNext() (2)E next() (3)remove()