《Java編程思想》筆記 第十一章 持有對象
1.保存對象引用
1.數組,數組具有固定大小
2.容器類,可自動調節大小
2.容器類
- List Set Queue Map 及常用的實現類
2.1 Collectioon (接口)
- 保存獨立的元素序列,未使用泛型時保存Object對象。(獨立並不是不同)
2.1.1 List(接口)
- 按插入順序保存
- ArrayList :先當於大小可變的數組,隨機訪問快,插入移除慢。
- LinkedList :插入移除快,訪問慢。
2.1.2 Set(接口)
- 不能有重復元素
- 1.HashSet :最快獲取元素,內部元素無規則排序。
- 1.1 LinkHashSet : 按插入順序保存元素,也有HashSet的查詢速度 .
- 2. TreeSet : 升序保存對象
2.1.3 Queue(接口)
- 容器的一端插入一端刪除
- 1 PriorityQueue 優先隊列
2.2 Map(接口)
- 保存鍵值對對象,鍵不能重復。鍵也是對象,值也是對象,按鍵查找。(也稱映射表,關聯數組,字典-->通過對象找對象)
- 2.1 HashMap : 查找獲取速度快,內部無規則排序
- 2.1.1 LinkHashMap : 按插入順序保存鍵,同時保存HashMap的查詢速度
- 2.2 TreeMap : 鍵升序保存對象。
3.預定義泛型
3.1 未預定義泛型時向容器內存入的是Object對象,所以get()取出來的也是Object對象,需要具體類型對象還需強制轉型
3.2 預定義泛型保存特點對象,可以防止將錯誤的類型放入容器中。 例如ArrayList<Apple>只保存Apple類型或者其子類型對象。
3.3 類型參數可以有多個但不可以是這樣 ArrayList<Apple,Orange>。
3.4 向上轉型對於泛型一樣適用,可以把Apple的子類放入ArrayList中,用get(index)取出來還是原來的子類型。
3.添加一組元素
- Arrays類和Collections類中的一些方法可以向Collection中添加一組元素。
3.1 Arrays.asList()接受一個數組或者用逗號分割的元素列表(列表元素類型可不同),並將其轉換成一個List對象返回。使用顯式類型說明Arrays.<類型>asList()可以確定List保存的類型。註意:此List對象底層是數組,因此不可改變其大小,不能添加刪除。
3.2 Collections.addAll(a,b) 接受一個Collection對象a,以及一個數組或者用逗號分割的列表b,將b中的元素添加到a中。
3.3 Collection.addAll(a) 只接受另一個Collection對象a,此方法運行速度快。
3.4 Collection的構造器可以接收一個Collection將自身初始化。
- 向Map中增加值 Map.put(key,value),取值Map.get(key)
4.容器打印
- 直接可打印,toString()方法已被覆寫。
5.打印數組
- 打印數組必須使用Arrays.toString(arrays) 打印數組(數組也是對象,直接打印對象引用輸出只是內存地址)
6.List中的一些方法
6.1 a.contains(reference)確定該引用指向的對象是否在列表中。
6.2 a.romove(reference/index)移除該引用指向/該索引的對象
6.3 a.indexOf(reference) 找出該引用指向對象的索引編號
6.4 a.subList(2,5) 從大列表a創建一個小列表從索引2開始,包括2,到5結束,不包括5。返回一個List
6.5 a.containsAll(b)確定b這個小列表是否在大列表中,與順序無關。
6.6 a.retainAll(b ) a,b取交集,並給a
6.7 a.removeAll(b) 把a中所有在b中的元素移除。
6.8 set(index , A) 用A對象替換索引處的對象。
6.9 a.isEmpty() a是否為空
6.10 a.clean() 清空a
6.11 a.toArray() 將Collection轉換為一個數組,無參數為Object數組,傳入一個具體數組對象參數,則轉換為該數組(類型不能錯),如果傳入的參數數組太小,將會自動創建合適大小的數組。
7.Iterator(接口) 叠代器
7.1 叠代器是個對象,它是用來遍歷並選擇序列中的對象
7.2 Iterator只能單向移動
7.3 用來產生叠代器對象的方法: iterator(),該方法屬於Iterater接口。一個容器調用該方法就可返回一個叠代器對象,並且該對象準備好返回容器的第一個元素。可以把該叠代器對象看成一個遊標,創建完成後指向容器序列的第一個元素之前。
Iterator<Apple> sl = al.iterator(); //sl就是叠代器,就相當於一個指針
7.4 sl.next()獲取下一個元素,執行完next()後當前sl就指向這個位置不變
7.5 sl.remove()刪除sl指向的元素,只有在next()執行之後指向一個存在元素才能使用,
7.6 sl.hasNext() 檢查序列中是否還有元素,有返回true,無返回false。
8.ListIterator
- 一個功能更強大的Iterator子類型,只能用於List訪問,而且可以雙向移動。
8.1 previous() 獲取前一個元素,hasPrevious()判斷前一個元素存在不。
8.2 List調用listIterator()產生一個指向第一個元素之前的叠代器,如果時listIerator(n),則開始就指向第n個元素。
8.3 相比於iterator()產生的叠代器多了add()和set()方法,add()將在遊標之前插入,set()將修改遊標所指內容。
9.foreach與叠代器
9.1 foreach主要用於數組,也可用於所有Collection對象。這是因為Collection接口繼承了Iterable接口。
9.2 Iterable接口包含一個產生Iterator對象的iterator()方法,只要實現Iterable接口,覆寫iterator()就可用於foreach。大量類已經實現了Iterable接口並覆寫了iterator()方法,如全部的Collection,但Map全不是。
執行foreach時會自動調用iterator()方法,該方法產生Iterator對象,該對象調用next() hasNext() remove()方法。
class Tr<T> implements Iterable { public Iterator<T> iterator(){ return new Iterator<T>(){ @Override public boolean hasNext() { // TODO Auto-generated method stub return false; } @Override public T next() { // TODO Auto-generated method stub return null; } @Override public void remove() { // TODO Auto-generated method stub }
9.3 實現Collection必須要實現iterator(),因為Collection繼承Iterable.
10.適配器
- 解決一個接口需要另一個接口的問題。比如想既能正向又能反向foreach一個List,如果重寫iterator()那就失去了正向功能,解決辦法就是添加一個方法,該方法能夠產生一個Iterable對象,覆寫該對象的iterator()方法使其具有反向功能。直接foreach該List對象則正向輸出,foreach該對象添加的方法則反向輸出。
11.LinkedList
- LinkedList 中的方法可以實現 棧 隊列 或者雙端隊列的效果
12.Stack (類)棧
- 後進先出(LIFO)容器。
- Java 提供的Stack類繼承自vector,vector底層用數組實現的,push 、pop 性能大大降低,Stack最好使用鏈表實現。
- 可以使用LinkedList實現。
13. Set
- Set與Collection有著完全一樣的接口,它沒有其他額外的功能,不像List。在分類上可以把它倆分為平級,實際上Set就是ollection,只是行為不同。Set要保持元素獨立,是基於對象值來確定歸屬
13.1 set1.contains/contiansAll(set2),用來確定set2是否歸屬與set1。
14.Map
14.1 map.containsKey(key),測試map是否包含該鍵,map.containsValue(value),測試map是否包含值。
14.2 Map可以返回它的鍵的Set,值的Collection,鍵值對的Set.
15.Queue (接口)
- 隊列 先進先出(FIFO),並發編程中很重要。
15.1 offer() 將一個元素插入隊尾或者返回false.
15.2 peek()和element()都在不移除的情況下返回隊頭。peek()在隊列為空時返回null,element()則拋異常
15.3 poll()和remove()移除情況下返回隊頭。poll()在隊列為空時返回null,remove()則拋異常
15.4 PriorityQueue
- 優先級隊列。先進先出描述了最典型的隊列規則 ,而優先級隊列則聲明下一個彈出最需要(優先級最高)的元素。
15.4.1 調用offer()方法時該對象會在隊列中被排序,可以使用自己提供的Comparator來修改這一順序。
15.4.2 在調用peek(),poll(),remove()方法時獲取的元素總是優先級最高的。
16.隊列規則
- 先進先出是典型的隊列規則,隊列規則是指給定一組隊列中的元素情況下,確定下一個彈出的元素的規則。優先級隊列就是一種非典型的隊列。
知識點
1.最基本最可靠的容器: ArrayList, add()插入一個元素,get(index)按索引訪問元素,size()返回容器內元素的數量。
2.所有 Collection 都可以使用 foreach
3.向Collection中添加多個new A()對象,這些對象不是同一個對象,Set中可存,索引也不同。
《Java編程思想》筆記 第十一章 持有對象