集合框架:
集合只用于存盤物件,集合長度是可變的,集合可以存盤不同型別的物件,
Collection 集合的頂層介面
Collection 方法概述:
添加 boolean add(Object obj): 添加一個元素
boolean addAll(Collection c): 添加一個集合的元素
洗掉 void clear(): 移除所有元素
boolean remove(Object o)移除一個元素
boolean removeAll(Collection c)移除一個集合的元素 只要有一個元素被移除了,就回傳true
判斷 boolean contains(Object o): 判斷集合中是否包含指定的元素
boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素 只有包含所有元素,才叫包含
boolean isEmpty(): 判斷集合是否為空
獲取 Iterator<E>iterator() 迭代器,集合的專用遍歷方式:獲取元素并移動到下一個位置: Object next();判斷是否有下一個元素:boolean hasNext()
長度 int size(): 元素個數
交集 boolean retainAll(Collection c) 兩個集合AB,AB做交集,最終結果保存在A中,B不變,回傳值表示A是否發生過改變
把集合轉換為陣列 Object[] toArray()
迭代器:遍歷集合的一種方式
依賴于集合而存在
迭代器原理:為什么不定位為一個類,而是一個介面?
Java中集合類的資料結構不同,存盤方式和遍歷方式不同,所以沒有定義迭代器類,無論在哪種集合都應該具備獲取元素的操作,并輔助于判斷功能,把這個兩個功能提取出來,并不提供具體實作,這種方式就是介面, 實作類在真正的具體的子類中,以內部類的方式體現的,
List:有序,可重復
添加:void add(int index, Object element):在指定位置添加元素
獲取:Object get(int index): 獲取指定位置的元素
串列迭代器:ListIterator listIterator(): List集合特有的迭代器
洗掉功能:Object remove(int index):根據索引洗掉元素
修改功能:Object set(set index, Object element):根據索引修改元素,并回傳被修改的元素
遍歷:size()和get()方法結合使用
使用迭代器
增強for
ListIterator的特有方法:
Object previous(): 獲取上一個元素
boolean hasPrevious(): 判斷是否有上一個元素
List的子類:
ArrayList:底層資料結構是陣列,查詢快,增刪慢,執行緒不安全,效率高
Vector:底層資料結構是陣列,查詢快,增刪慢,執行緒安全,效率低
LinkedList:底層資料結構是鏈表,查詢慢,增刪快,執行緒不安全,效率高
Vector:
添加:public void addElement(Object obj)
獲取:public Object elementAt(int index)
public Enumeration elements()
Enumeration介面的方法:boolean hasMoreElements()
Object nextElement()
LinkedList:
添加:public void addFirst(Object e)
public void addLast(Object e)
獲取:public Object getFirst()
public Object getLast()
洗掉:public Object removeFirst()
public Object removeLast()
泛型:是一種把型別明確的作業推遲到創建物件或者呼叫方法的時候才去明確的特殊型別,引數化型別,把型別當作引數一樣傳遞,
例如:ArrayList<String> array = new ArrayList<String>();
作用:把運行時期的問題提前到了編譯期間
避免了強制型別的轉換
泛型推斷:ArrayList<String> array = new ArrayList<>();
早期的Object型別可以接受任意的物件型別,但是在實際使用中,會有型別轉換的問題,也就存在著隱患,所以Java提供了泛型來解決這個安全問題,
泛型類:
把泛型定義在類上,格式:public class 類名 <泛型型別1,.....>,注意泛型型別必須是參考型別
泛型方法:
把泛型定義在方法上,格式:public <泛型型別> 回傳型別 方法名(泛型型別....)
泛型介面:
把泛型定義在介面上,格式:public interface 介面名<泛型型別1....>
泛型通配符:
?:表示任意型別
?extands E:向下限型,E及其子類
?super E: 向上限型,E及其父類
增強for:簡化了陣列和集合的遍歷,但是增強for的目標不能為null
格式: for(元素資料型別 變數:陣列或者Collection集合){
使用變數即可,該變數就是元素
}
增強for其實是用來替代迭代器的
靜態匯入:
格式:import static 包名...類名.方法名
可以直接匯入到方法的級別
注意:方法必須是靜態的,注意多個同名的靜態方法
可變引數:定義方法的時候不知道該定義多少個引數
格式:修飾符 回傳值型別 方法名 (資料型別... 變數名){ }
注意:這里的變數其實是一個陣列,如果一個方法有可變引數,并且有多個引數,那么,可變引數肯定是最后一個
ArrayList集合的toString()方法原始碼:
1 代碼: 2 Collection c = new ArrayList(); 3 c.add("hello"); 4 c.add("world"); 5 c.add("java"); 6 7 System.out.println(c); 8 9 為什么c輸出的不是地址值呢? 10 A:Collection c = new ArrayList(); 11 這是多型,所以輸出c的toString()方法,其實是輸出ArrayList的toString() 12 13 B:看ArrayList的toString() 14 而我們在ArrayList里面卻沒有發現toString(), 15 以后遇到這種情況,也不要擔心,你認為有,它卻沒有,就應該去它父親里面看看, 16 17 【C:toString()的方法原始碼】 18 19 public String toString() { 20 Iterator<E> it = iterator(); //集合本身呼叫迭代器方法,得到集合迭代器 21 if (! it.hasNext()) 22 return "[]"; 23 24 StringBuilder sb = new StringBuilder(); 25 sb.append('['); 26 for (;;) { 27 E e = it.next(); //e=hello,world,java 28 sb.append(e == this ? "(this Collection)" : e); 29 if (! it.hasNext()) 30 //[hello, world, java] 31 return sb.append(']').toString(); 32 sb.append(',').append(' '); 33 } 34 }
Set:不包含重復元素,無序
HashSet保證元素唯一性的原始碼:
通過查看add方法的原始碼,我們知道這個方法底層依賴 兩個方法:hashCode()和equals(),
思路步驟:首先比較哈希值, 如果相同,繼續走,比較地址值或者走equals(), 如果不同,就直接添加到集合中
LinkedHashSet:
底層資料結構由哈希表和鏈表組成,哈希表保證元素的唯一性,鏈表保證元素有序
TreeSet:排序和唯一 底層是紅黑樹
能夠對元素按照某種規則進行排序
排序有兩種方式:自然排序(無參構造):元素具備比較性 讓元素所屬的類實作自然排序介面Comparable,比較器排序(帶參構造):集合具備比較性 讓集合的構造方法接收一個比較器介面的子類物件Comparetor
唯一性根據比較的回傳是否是0來決定
Map集合
將鍵映射到值的物件,一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值,
Map集合的資料結構只針對鍵有效,跟值無關,
Map方法概述:
1:添加:V put(K key, V value ): 添加元素,如果鍵是第一次存盤,就直接存盤回傳null;若不是第一次,就修改value,回傳以前的值,
2:洗掉: void clear(): 移除所有的鍵值對元素
V remove(Object key): 根據鍵洗掉鍵值對元素,并把值回傳
3:判斷: boolean containsKey(Object key): 判斷集合是否包含指定的鍵
boolean containsValue(Object value): 判斷集合是否包含指定的值
boolean isEmpty(): 判斷集合是否為空
4:獲取:Set<Map.Entry<K,V>> entrySet(): 回傳的是鍵值對物件的集合
V get (Object key): 根據鍵獲取值
Set<K> keySet(): 獲取集合中所有鍵的集合
Collection<V> values(): 獲取集合中所有值的集合
5:長度:int size(): 回傳集合中的鍵值對的對數
HashMap
LinkedHashMap 是Map介面的哈希表和鏈表實作,具有可預知的迭代順序
由哈希表保證鍵的唯一性,由鏈表保證鍵的有序(存盤和取出的順序一致)
TreeMap
是基于紅黑樹的Map介面實作,
Hashtable和HashMap的區別
HashMap:執行緒不安全,效率高,允許null鍵和null值
Hashtable:執行緒安全,效率低,不允許null鍵和null值
Collections工具類
針對集合操作的工具類
Colllection和Collections的區別:
Collection是單列集合的頂層介面,有子介面List和Set
Collections是針對集合操作的工具類,有對集合進行排序和二分查找的方法
方法
public static <T> void sort(List<T> list):排序 默認情況下是自然順序,
public static <T> int binarySearch(List<?> list,T key):二分查找
public static <T> T max(Collection<?> coll):最大值
public static void reverse(List<?> list):反轉
public static void shuffle(List<?> list):隨機置換
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/170804.html
標籤:其他
