Java集合(Collection)綜述

1.集合簡介

數學定義:通常地,咱們把研究對象統稱爲元素。把一些元素組成的整體叫作集合。前端

java集合定義:集合就是一個放數據的容器,準確的說是放數據對象引用的容器。java

java中通用集合類存放於java.util包中。後端

2.集合的實現

實現集合(Collection)的數據類型有三種:數組

  • 1.集(set)無序、不重複數據結構

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

    例如:HashSet 特例:TreeSet 有序的spa

  • 2.列表(list)有序、可重複code

    List裏存放的對象是有序的,同時也是能夠重複的,List關注的是索引,擁有一系列和索引相關的方法。對象

    例如ArrayList、LinkedList 等blog

  • 3.隊列(Queue)

    隊列是一種特殊的線性表,它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。

    在隊列這種數據結構中,最早插入的元素將是最早被刪除的元素;反之最後插入的元素將是最後被刪除的元素,所以隊列又稱爲「先進先出」(FIFO—first in first out)的線性表。

    例如 ArrayBlockingQueue、LinkedBlockingQueue等。因爲其難以管理,性能不穩定等特色,通常項目中不多使用。

  • 4.Map(映射)(鍵值對、鍵惟1、值不惟一) Map與collection的關係爲依賴關係並非其餘三種的泛化關係。這一點要區分。

    例如 HashMap、TreeMap

3.集合的層次關係

全部的集合都繼承與Collection,而Collection實現了Iterator接口。類圖以下 java集合 依據實現分類

| 接口\實現 | 哈希表(Hash) |數組(Array)|平衡二叉樹(Balanced Tree)| 鏈表(Linked List)|哈希表+鏈表(Hash + Linked List)|枚舉(enum)| | :------------- | :------------- |:------------- |:------------- |:------------- |:------------- | |集(Set)|HashSet | |TreeSet||LinkedHashSet|EnumSet| |列表(List)| |ArrayList<br/>Stack||LinkedList||| |隊列(Queue)| |ArrayBlockingQueue<br/>ArrayDeque<br>PriorityQueue ||LinkedBlockingQueue||| |映射(Map)|HashMap<br/>HashTable<br/>WeakHashMap<br/>IdentityHashMap | |TreeMap||LinkedHashMap|EnumMap| 後續的篇章中我將各個實現類逐個解析。

4.抽象方法解讀

1.Iterator與Iterable接口

定義迭代器,Iterator 接口中有三個方法:

1.hasNext()是否還有下一個元素。

2.next()返回下一個元素。

3.remove()刪除當前元素。

定義是否能獲取迭代器,Iterable 接口中的方法

iterator() return Iterator<T> 返回一個迭代器。提供一個獲取迭代器的方法。

2.Collection接口

Collection接口中的方法:

1.size() return int 集合中元素個數。

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
System.out.println(list1.size());

結果 3

2.isEmpty() return boolean 集合是否爲空集合。

List<String> list1 = new ArrayList<String>();
System.out.println(list1.isEmpty());

結果 true

3.contains(Object o) return boolean 集合中是否包含該元素。

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
boolean isCont = list1.contains("3");
System.out.println(isCont);

結果: true

4.iterator() return Iterator<E> 返回一個迭代器與Iterable中的重複了。

5.toArray() return Object[] 將全部元素以數組形式返回。

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
for(Object obj:list1.toArray()) {
  System.out.print(obj+" ");
}

結果 1 2 3

6.<T> T[] toArray(T[] a) 將全部元素按照約定的數據類型返回。<T> 數據類型。

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
for(Object obj:list1.toArray(new String[4])) {
System.out.print(obj+" ");
}

結果 1 2 3 null

7.boolean add(E e); 添加元素

8.boolean remove(Object o) 移除元素

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
System.out.println(list1);
list1.remove("2");
System.out.println(list1);

結果<br/> [1, 2, 3]<br/> [1, 3]

9.boolean containsAll(Collection<?> c) 當前集合是否包含傳入集合的所有元素

List<String> list1 = new ArrayList<String>();

list1.add("1");
list1.add("2");
list1.add("3");

List<String> list2 = new ArrayList<String>();
list2.add("1");
list2.add("2");
System.out.print(list1.containsAll(list2));

List<String> list3 = new ArrayList<String>();
list3.add("1");
list3.add("2");
list3.add("4");
System.out.print(list1.containsAll(list3));

結果 true false

10.boolean addAll(Collection<? extends E> c) 將傳入的集合所有添加到該集合中。(引用添加,若是引用的內容變化該集合也變化)

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list3 = new ArrayList<String>();
list3.add("1");
list3.add("2");
list3.add("4");
list1.addAll(list3);
System.out.println(list1);

結果 [1, 2, 3, 1, 2, 4]

11.boolean removeAll(Collection<?> c) 移除該集合中包含傳入集合的元素。

List<String> list1 = new ArrayList<String>();

list1.add("1");
list1.add("2");
list1.add("3");

List<String> list2 = new ArrayList<String>();
list2.add("1");
list2.add("2");
list1.removeAll(list2);
System.out.println(list1);

結果 [3]

另一個例子

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list3 = new ArrayList<String>();
list3.add("1");
list3.add("2");
list3.add("4");
list1.removeAll(list3);
System.out.println(list1);

結果 [3]

因而可知無論傳入元素有多少不相同的元素list的實現是隻移除傳入集合中與調用集合中元素相同的部分。

12.boolean retainAll(Collection<?> c) 保留該集合中至關於傳入元素的集合,其餘的元素刪除。至關於 取兩個集合的交集

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
List<String> list3 = new ArrayList<String>();
list3.add("1");
list3.add("2");
list3.add("4");
list1.retainAll(list3);
System.out.println(list1);

結果 [1, 2]

13.void clear() 清空全部元素

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.clear();
System.out.println(list1);

結果 []

14.boolean equals(Object o) 判斷是否相同

15.int hashCode() 返回該集合的哈希值。

3.AbstractCollection抽象方法

該抽象方法實現了Collection接口除了統計大小未實現外其餘方法都提供了一個簡單的實現方式。

4.ListIterator接口

ListIterator繼承了Iterator接口。因爲list的下表操做性因此ListIterator在Iterator接口方法的基礎上能夠拓展不少下標特色的方法,好比在迭代中轉向、修改元素、添加元素等。

1.boolean hasPrevious() 是否有前一個

2.E previous() 返回前一個元素

3.int nextIndex() 下一個元素的下標

4.int previousIndex() 前一個元素的下標

5.void set(E e) 迭代中替換元素

6.void add(E e) 迭代中添加元素

5.List接口

List接口繼承了Collection接口中的全部方法並從新定義了Collection接口中方法的規範。添加了一些list專用的方法。

1.E get(int index) 經過下標獲取元素

2.E set(int index, E element) 將元素放入集合

3.void add(int index, E element) 添加新元素

4.E remove(int index) 依據下標移除元素

5.int indexOf(Object o) 查詢元素位置從前日後找。

6.int lastIndexOf(Object o) 查詢元素位置從後往前找。

7.ListIterator<E> listIterator() 獲取list迭代器。

8.ListIterator<E> listIterator(int index) 從該元素位置迭代到最後一個元素。

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
ListIterator<String> i = list1.listIterator(1);
while(i.hasNext()) {
  System.out.println(i.next());
}

結果 2 3

9.List<E> subList(int fromIndex, int toIndex) 依據下標截取一段列表(list)

List<String> list1 = new ArrayList<String>();
list1.add("1");
list1.add("2");
list1.add("3");
List<String> subList = list1.subList(1, 2);
System.out.println(subList);

結果 [2]

返回的結果並非ArrayList 而是ArrayList中的一個內部類SubList。SubList只是ArrayList的一個視圖(映射) 因此沒法轉換爲ArrayList.

6.Set和AbstractSet

Set接口繼承了Collection接口中的全部方法並從新定義了Collection接口中方法的規範。 AbstractSet繼承AbstractCollection 並重寫了equals、removeAll、hashCode等方法

7.Queue

Queue繼承了Collection接口中的方法並從新定義了Collection接口中方法規範。並從新添加了一些隊列相關方法。

1.boolean add(E e) 像隊列尾部添加一個元素,無容量檢查。

2.boolean offer(E e) 向隊列尾部添加一個元素,有容量檢查。

3.E remove() 移除頭部一個元素。

4.E poll() 移除頭部一個元素。

5.E element() 獲取頭部元素並不移除元素。

6.E peek() 檢索但不刪除此隊列的頭部。

8.Map

Map做爲集合中比較特殊的一個部分。使用了關聯的方式使用了Collection並不存在繼承關係。 Map的結構自成一體。下面介紹下Map接口中的功能。

1.interface Entry<K,V> 因爲Map中的元素是以Key-Value方式存儲的實際上就是一個一個的Entry.在Map中維護一個組合key和value的對象是有必要的。 這個對象中的方法有K getKey()、V getValue()、V setValue(V value)、boolean equals(Object o)、int hashCode()

2.int size() 元素個數

3.boolean isEmpty() 元素是否爲空

4.boolean containsKey(Object key) 是否包含傳來的key

5.boolean containsValue(Object value) 是否包含傳來的Value

6.V get(Object key) 經過key獲取value

7.V put(K key, V value) 將一個key-value放入map

8.V remove(Object key) 移除傳來key的entity

9.void putAll(Map<? extends K, ? extends V> m)將傳來的map中的entity傳入該Map中、

10.void clear() 清空該集合

11.Set<K> keySet() 將key遍歷到Set集合中

12.Collection<V> values() 返回一個全部元素的引用。

13.Set<Map.Entry<K, V>> entrySet() 返回一個entry的set集合

14 equales 和 hashCode

5.總結

將全部抽象層級比較高的的抽象方法都瞭解了一遍。有些抽象層級並無寫,到具體介紹時才進行編寫。 java的集合家族龐大可是結構很是清晰。須要繼續深刻的研究。

相關文章
相關標籤/搜索