1. 程式人生 > >菜鳥先飛之JAVA_集合

菜鳥先飛之JAVA_集合

集合框架
集合的由來 陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義。java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少。
陣列和集合的區別 區別1 : 陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值 集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是在儲存的時候會自動裝箱變成物件 區別2: 陣列長度是固定的,不能自動增長 集合的長度的是可變的,可以根據元素的增加而增長
陣列和集合什麼時候用
1,如果元素個數是固定的推薦用陣列 2,如果元素個數不是固定的推薦用集合
Collection集合
Collection集合的概述 Collection 層次結構 中的根介面。Collection 表示一組物件,這些物件也稱為 collection 的元素。JDK 不提供此介面的任何直接 實現:它提供更具體的子介面(如 Set 和 List)實現。
Collection集合的方法 boolean add(E e) 確保此 collection 包含指定的元素(可選操作)。如果此 collection 由於呼叫而發生更改,則返回 true。(如果此 collection 不允許有重複元素,並且已經包含了指定的元素,則返回 false。) boolean remove(Object o) 從此 collection 中移除指定元素的單個例項。底層依賴equals方法進行比較。 void clear() 移除此 collection 中的所有元素(可選操作)。 boolean contains(Object o) 如果此 collection 包含指定的元素,則返回 true。底層依賴equals方法進行比較。 boolean isEmpty() 如果此 collection 不包含元素,則返回 true。 int size() 返回此 collection 中的元素數。 Object[] toArray() 返回包含此 collection 中所有元素的陣列。 boolean addAll(Collection c) 將指定 collection 中的所有元素都新增到此 collection 中(可選操作)。 boolean removeAll(Collection c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。 boolean containsAll(Collection c) 如果此 collection 包含指定 collection 中的所有元素,則返回 true。 boolean retainAll(Collection c) 僅保留此 collection 中那些也包含在指定 collection 的元素(可選操作)。
迭代器

迭代器概述 集合是用來儲存元素,儲存的元素需要檢視,那麼就需要迭代(遍歷)
迭代器原理 迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的儲存結構都是不同的,所以每一個集合存和取都是不一樣,那麼就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出介面,然後在每個類的內部,定義自己迭代方式,這樣做的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,程式碼有底層內部實現,使用者不用管怎麼實現的,會用即可
LIst集合

List集合的概述 有序的 collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。
List集合的特有功能概述 void add(int index,E element) 在列表的指定位置插入指定元素(可選操作)。將當前處於該位置的元素(如果有的話)和所有後續元素向右移動(在其索引中加 1)。 E remove(int index) 移除列表中指定位置的元素(可選操作)。將所有的後續元素向左移動(將其索引減 1)。返回從列表中移除的元素。 E get(int index) 返回列表中指定位置的元素。 E set(int index,E element) 用指定元素替換列表中指定位置的元素(可選操作)。
List的三個子類的特點 ArrayList: 底層資料結構是陣列,查詢快,增刪慢。執行緒不安全,效率高。 Vector: 底層資料結構是陣列,查詢快,增刪慢。執行緒安全,效率低。 LinkedList: 底層資料結構是連結串列,查詢慢,增刪快。 執行緒不安全,效率高。 Vector和ArrayList的區別 Vector是執行緒安全的,效率低 ArrayList是執行緒不安全的,效率高 共同點:都是陣列實現的 ArrayList和LinkedList的區別 ArrayList底層是陣列結果,查詢和修改快 LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢 共同點:都是執行緒不安全的 List有三個子類,我們到底使用誰呢? Vector相對ArrayList查詢慢(執行緒安全的),Vector相對LinkedList增刪慢(陣列結構)。查詢多用 ArrayList、增刪多用LinkedList、如果都多ArrayList。
Vector類
Vector類的概述 Vector 類可以實現可增長的物件陣列。與陣列一樣,它包含可以使用整數索引進行訪問的元件。但是,Vector 的大小可以根據需要增大或縮小,以適應建立 Vector 後進行新增或移除項的操作。Vector跟ArrayList是類似的,內部實現也是動態陣列,隨機訪問效率高。Vector是執行緒安全的。
Vector類特有功能 public void addElement(E obj) 將指定的元件新增到此向量的末尾,將其大小增加 1。如果向量的大小比容量大,則增大其容量。 public E elementAt(int index) 返回指定索引處的元件。 public Enumeration elements() 返回此向量的元件的列舉。返回的 Enumeration 物件將生成此向量中的所有項。
ArrayList類
ArrayList類的概述 List 介面的大小可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 介面外,此類還提供一些方法來操作內部用來儲存列表的陣列的大小。(此類大致上等同於 Vector 類,除了此類是不同步的。)ArrayList內部實現採用動態陣列,當容量不夠時,自動擴容至(當前容量1.5+1)。元素的順序按照插入的順序排列。預設初始容量為10。 contains複雜度為O(n),add複雜度為分攤的常數,即新增n個元素需要O(n)時間,remove為O(n),get複雜度為O(1) 隨機訪問效率高,隨機插入、刪除效率低。ArrayList是非執行緒安全的。
LinkedList類
LinkedList類的概述 List 介面的連結列表實現。實現所有可選的列表操作,並且允許所有元素(包括 null)。除了實現 List 介面外,LinkedList 類還為在列表的開頭及結尾 get、remove 和 insert 元素提供了統一的命名方法。這些操作允許將連結列表用作堆疊、佇列或雙端佇列。LinkedList內部使用雙向連結串列實現,隨機訪問效率低,隨機插入、刪除效率高。可以當作堆疊、佇列、雙向佇列來使用。LinkedList也是非執行緒安全的。
LinkedList類的特有方法 public void addFirst(E e) 將指定元素插入此列表的開頭。 public void addLast(E e) 將指定元素新增到此列表的結尾。 public E getFirst() 返回此列表的第一個元素。 public E getLast() 返回此列表的最後一個元素。 public E removeFirst() 移除並返回此列表的第一個元素。 public E removeLast() 移除並返回此列表的最後一個元素。 public E get(int index); 返回此列表中指定位置處的元素。
set集合
set集合的概述 一個不包含重複元素的 collection。並且可以包含一個 null 元素。無索引,不可以重複,無序(存取不一致)。其實現類有HashSet,繼承於它的介面有SortedSet介面等。Set中提供了加、減、和交等集合操作函式。Set不能按照索引隨機訪問元素,這是它與List的一個重要區別。
HashSet類
HashSet類的概述 此類實現 Set 介面,由雜湊表(實際上是一個 HashMap 例項)支援。它不保證 set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。HashSet內部是使用HashMap實現的,HashSet的key值是不允許重複的,如果放入的物件是自定義物件,那麼最好能夠同時重寫hashCode與equals函式,這樣就能自定義新增的物件在什麼樣的情況下是一樣的,即能保證在業務邏輯下能新增物件到HashSet中,保證業務邏輯的正確性。另外,HashSet裡的元素不是按照順序儲存的。HashSet是非執行緒安全的。
HashSet保證元素唯一性的原理 我們使用Set集合都是需要去掉重複元素的,如果在儲存一個新的元素的時候逐個equals()比較。效率較低、雜湊演算法提高了去重複的效率,降低了使用equals()方法的次數。當HashSet呼叫add()方法儲存物件的時候, 先呼叫物件的hashCode()方法得到一個雜湊值, 然後在集合中查詢是否有雜湊值相同的物件。如果沒有雜湊值相同的物件就直接存入集合。如果有雜湊值相同的物件, 就和雜湊值相同的物件逐個進行equals()比較,比較結果為false就存入, true則不存。
HashSet儲存自定義物件的注意事項 1、類中必須重寫hashCode()和equals()方法。 2、hashCode(): 屬性相同的物件返回值必須相同, 屬性不同的返回值儘量不同(提高效率) 3、equals(): 屬性相同返回true, 屬性不同返回false,返回false的時候儲存。
LinkedHashSet類
LinkedHashSet的概述 可預知迭代順序的 Set 介面的雜湊表和連結列表實現。LinkedHashSet可以保證怎麼存就怎麼取。底層是連結串列實現的,是set集合中唯一一個能保證怎麼存就怎麼取的集合物件。因為是HashSet的子類,所以也是保證元素唯一的,與HashSet的原理一樣。LinkedHashSet繼承自HashSet,它與HashSet不同的是,LinkedHashSet儲存元素的順序是按照元素的插入順序儲存的。LinkedHashSet也是非執行緒安全的。
TreeSet類
TreeSet類的概述 使用元素的自然順序對元素進行排序,或者根據建立 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。如果是儲存的元素是自定義物件,那麼需要實現Comparable介面。TreeSet也是非執行緒安全的。
TreeSet類的特點 TreeSet是用來排序的, 可以指定一個順序, 物件存入之後會按照指定的順序排列
TreeSet保證元素唯一和自然排序的原理 1、自然順序(Comparable) 1)TreeSet類的add()方法中會把存入的物件提升為Comparable型別 2)呼叫物件的compareTo()方法和集合中的物件比較 3)根據compareTo()方法返回的結果進行儲存,底層是二叉樹結構,返回0不儲存、返回負數儲存左邊、整數儲存右邊。 2、比較器順序(Comparator) 1)建立TreeSet的時候可以制定 一個Comparator 2)如果傳入了Comparator的子類物件, 那麼TreeSet就會按照比較器中的順序排序 3)add()方法內部會自動呼叫Comparator介面中compare()方法排序 4)呼叫的物件是compare方法的第一個引數,集合中的物件是compare方法的第二個引數 3、兩種方式的區別 1)TreeSet建構函式什麼都不傳, 預設按照類中Comparable的順序(沒有就報錯ClassCastException) 2)TreeSet如果傳入Comparator, 就優先按照Comparator

Map集合
Map集合的概述 將鍵對映到值的物件。Map集合提供了按照“鍵值對”儲存元素的方法,一個鍵唯一對映一個值。集合中“鍵值對”整體作為一個實體元素時,類似List集合,但是如果分開來年,Map是一個兩列元素的集合:鍵是一列,值是一列。與Set集合一樣,Map也沒有提供隨機訪問的能力,只能通過鍵來訪問對應的值。Map的每一個元素都是一個Map.Entry,這個實體的結構是< Key, Value >樣式。
Map集合的功能 新增功能 V put(K key,V value):新增元素。 如果鍵是第一次儲存,就直接儲存元素,返回null;如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值。 刪除功能 void clear():移除所有的鍵值對元素 V remove(Object key):根據鍵刪除鍵值對元素,並把值返回 判斷功能 boolean containsKey(Object key):判斷集合是否包含指定的鍵 boolean containsValue(Object value):判斷集合是否包含指定的值 boolean isEmpty():判斷集合是否為空 獲取功能 Set<Map.Entry<K,V>> entrySet();將map集合的鍵值對看作為一個物件儲存在Set集合中。 V get(Object key):根據鍵獲取值 Set<K> keySet():獲取集合中所有鍵的集合 Collection<V> values():獲取集合中所有值的集合 int size():返回集合中的鍵值對的個數
HashMap介面的概述 基於雜湊表的 Map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。但它是非執行緒安全的。
Hashtable的概述 Hashtable也是Map的實現類,繼承自Dictionary類。它與HashMap不同的是,它是執行緒安全的。而且它不允許key為null,value也不能為null。由於它是執行緒安全的,在效率上稍差於HashMap。
HashMap和Hashtable的區別 Hashtable是JDK1.0版本出現的,是執行緒安全的,效率低。HashMap是JDK1.2版本出現,是執行緒不安全的,效率高。 Hashtable不可以儲存null鍵和null值,HashMap可以儲存null鍵和null值。
LinkedHashMap的概述 Map 介面的雜湊表和連結列表實現,具有可預知的迭代順序。底層是連結串列實現的可以保證怎麼存就怎麼取。
TreeMap類的概述 基於紅黑樹(Red-Black tree)的 NavigableMap 實現。該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的 Comparator 進行排序,具體取決於使用的構造方法。
集合框架圖