1. 程式人生 > >《Java編程思想》筆記 第十一章 持有對象

《Java編程思想》筆記 第十一章 持有對象

而且 位置 pty dex 優先級 poll IT ise 註意

1.保存對象引用

1.數組,數組具有固定大小

2.容器類,可自動調節大小

2.容器類

  • List Set Queue Map 及常用的實現類

2.1 Collectioon (接口)

  1. 保存獨立的元素序列,未使用泛型時保存Object對象。(獨立並不是不同)

2.1.1 List(接口)

  • 按插入順序保存
  1. ArrayList :先當於大小可變的數組,隨機訪問快,插入移除慢。
  2. 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編程思想》筆記 第十一章 持有對象