標籤:
內容:
/********************
數組與集合
集合架構體系
SET介面
LIST介面
迭代器介面
Map介面
老集合類的使用
內部比較子與外部比較子
集合類的綜合使用
********************/
一. 數組
int[] aryInt = new int[100]
用於容納一組資料
數組的特點:
在Java中,數組是被當做對象處理的
數組長度在數組初始化時必須固定
長度在固定之後,要改變數組長度大小的話,必須對數組進行長度大小變化的控制
package com.fjnu.study2;public class Array { public static void main(String[] args){ String[] strs = new String[10]; //當作對象, 定義一個數組長度為10 String[] strs1 = { "1", "2" }; String[] strs2 = null; String[] strs3; String[] strs4 = new String[] {}; System.out.println(strs.length); System.out.println(strs1.length); //System.out.println(strs2.length); //運行期間出錯, 因為對象沒有執行個體化 //System.out.println(strs3.length); //編譯期間錯誤,因為沒有賦初值 System.out.println(strs4.length); }}
1020
數組的優缺點:
數組存取效率高,使用時要求容量大小固定;適合基礎資料型別 (Elementary Data Type)的存取;
而集合存取效率上有一定的犧牲,集合容量大小可以根據實際需要改變,提供豐富的存取方法,適合成為對象的“容器”;
集合用來儲存物件。
兩個對象的equals相等,那麼他們的雜湊碼一定相等
兩個對象的雜湊碼相等,那麼他們的equal不一定相等。
Collection介面
集合架構的根通用方法 boolean contains(Object a) boolean equals(Object a) Iterator iterator() //遍曆 int size() void clear() boolean add(Object a) Boolean remove(Object a)
Set介面以及特點
擴充Collection介面 不允許重複元素 允許一個null值 對 add()、equals() 和 hashcode() 方法添加了限制
set介面的實作類別
HashSetLinkedHashSetCopyOnWriteArraySetTreeSet
HashSet的特點
底層是以雜湊表的演算法實現的。不是線程同步的一個集合類探討HashSet中的重複概念?探討HashSet中的元素到底是不是無序的?
什麼是重複
public boolean equals(Object obj) 指示某個其他對象是否與此對象“相等”。 注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的雜湊碼。 public int hashCode() 產生對象的雜湊碼。返回Object Storage Service的物理地址(實際上可能並不是),但是是用來標識對象的一個標記號。
LinkedHashSet特點
LinkedHashSet的特點底層是以鏈表實現的LinkedHashSet是有序的(插入順序有序)不是線程同步的一個集合類
CopyOnWriteArraySet
CopyOnWriteArraySet的特點底層是以數組實現的安全執行緒的集合類。元素之間是有序的.(插入有序)
copyOnWriteArraySet 是用數組實現了, 而LinkHashSet是用鏈表實現的,會更快
TreeSet的特點
TreeSet的特點底層是以TreeMap實現的紅/黑樹狀結構結構不是安全執行緒的類元素之間是有序的(不是插入順序,而是指元素之間有序)。
迭代器Iterator
對集合進行迭代的迭代器。迭代器代替了 Java Collections Framework 中的 Enumeration。包含如下方法: boolean hasNext() 如果仍有元素可以迭代,則返回 true。Object next() 返回迭代的下一個元素。 boolean remove(Object o) 從迭代器指向的集合中移除迭代器返回的最後一個元素(可選操作)。每次調用 next 只能調用一次此方法
迭代器會出現快速失敗異常
什麼叫快速失敗異常出現快速失敗異常的原因如何解決快速失敗異常A:使用迭代器刪除B:使用安全執行緒的集合
快速失敗異常的原因舉例:如果在迭代的過程中,有其他線程在修改這個迭代的資料,那麼迭代的資料就會具有不定性,所以會出現錯誤。
package com.fjnu.study2;import java.util.HashSet;import java.util.Set;import java.util.Iterator;public class interg { public static void main(String[] args){ Set set = new HashSet(); set.add("aa"); set.add("bb"); set.add("cc"); System.out.println(set); Iterator iterator = set.iterator(); while (iterator.hasNext()){ String str = (String)iterator.next(); if (str.equals("bb")){ //set.remove(str);//出現快速失敗異常 iterator.remove(); } } System.out.println(set); }}
List介面以及特點
擴充了Collection介面具有順序的集合(插入的順序)元素可以通過其整型下標訪問可以包含重複元素方法分類定位方法:get()、set()、add()、remove()、addAll()搜尋方法:indexOf() 和 lastIndexOf() ListIterator方法:listIterator() 和 subList()
List介面的實作類別
ArrayList類: 由一個數組後推而成,適合查詢頻繁的列表LinkedList類: 由一個雙向鏈表後推而成,適合插入刪除頻繁的列表
ArrayList的特點
ArrayList的特點底層是以數組實現的元素是有序的(插入順序)不是安全執行緒的集合類適合尋找頻繁的操作
LinkedList
LinkedList的特點底層是以鏈表實現的數組元素是有序的(插入順序)不是安全執行緒的集合類適合增刪改比較頻繁的操作
CopyOnWriteArrayList
CopyOnWriteArrayList的特點底層是以數組實現的元素是有序的(插入順序)安全執行緒的集合類尋找速度比較快,增刪改速度比較慢。
注意List中的sublist的用法
Map介面
關鍵字唯一將鍵映射至值的對象每個鍵最多都只能映射至一個值索引值重複的話,後面添加的後覆蓋前面元素的值。重要方法基本操作 put()、get()、remove()、containsKey()、containsValue()、size() 和 isEmpty() 批操作 putAll() 和 clear() 集合視圖 keySet()、values() 和 entrySet()
HashMap
底層是以雜湊演算法實現允許一個NULL鍵,允許多個NULL值元素之間是無序的不是安全執行緒的集合類
LinkedHashMap
底層是以鏈表實現允許一個NULL鍵,允許多個NULL值元素之間是有序的(插入順序有序)不是安全執行緒的集合類
TreeMap
底層是以紅/黑樹狀結構演算法實現元素之間是有序的(是對象之間有序)不是安全執行緒的集合類
迭代Map
通過KeySet來迭代通過Values來迭代通過Map.Entry來迭代
老的集合類
VectorHashTableEnumeration
HashTable
HashTable的特點不允許空鍵不允許空值其它的特點與用法與HashMap相同。
Enumeration
包含下列方法:boolean hasMoreElements() 若且唯若此枚舉對象至少還包含一個可提供的元素時,才返回 true;否則返回 false。 Object nextElement() 得到此枚舉的下一個元素。與Iterator的區別: 迭代器允許調用方利用定義良好的語義在迭代期間從迭代器所指向的集合移除元素。思考Enumeration中為什麼不提供remove方法?
【學習筆記】java集合架構1