1. 程式人生 > >java基礎08_Collection集合及泛型

java基礎08_Collection集合及泛型

主要內容 Collection 集合、 迭代器、 增強 for、 泛型 1. Collection 集合

集合 :集合是java中提供的一種容器,可以用來儲存多個數據。 集合和陣列既然都是容器,區別為: 陣列的長度是固定的。集合的長度是可變的。 陣列中儲存的是同一型別的元素,可以儲存基本資料型別值。集合儲存的都是物件。而且物件的型別可以不一致。在開發中一般當物件多的時候,使用集合進行儲存。 常見方法: 1)public boolean add(E e) : 把給定的物件新增到當前集合中 。(增) 2)public void clear() :清空集合中所有的元素(刪)。 3)public boolean remove(E e) : 把給定的物件在當前集合中刪除(刪)。 4)public boolean contains(E e) : 判斷當前集合中是否包含給定的物件(判斷)。 5)public boolean isEmpty() : 判斷當前集合是否為空(判斷)。 6)public int size() : 返回集合中元素的個數(查)。 7)public Object[] toArray() : 把集合中的元素,儲存到陣列中 二、Iterator (迭代器)。 如何對集合進行遍歷? 之前呼叫get方法,根據索引獲取元素的方式遍歷集合其實並不適用於所有的集合,因為有些集合是沒有索引的。有一種通用的遍歷集合的方式,這種方式叫做迭代器遍歷。迭代器就是一個遍歷集合的工具, 內部有一個游標,這個游標最開始指向集合的最開頭。 如何獲取一個集合的迭代器? 呼叫Collection裡面的方法 Iterator iterator(): 獲取集合對應的迭代器。

Iterator 表示的就是迭代器。如果要使用迭代器遍歷,還需要用到Iterator中的兩個方法 1)boolean hasNext(): 判斷是否還有沒有元素可以獲取。 2)E next(): 獲取當前迭代器游標位置的元素,然後再讓游標向後移動一個位置。 遍歷的步驟: 在呼叫Iterator的next方法之前,迭代器的索引位於第一個元素之前,不指向任何元素,當第一次呼叫迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次呼叫next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。 1. 呼叫集合的iterator方法,獲取到這個集合對應的迭代器。 2. 通過迭代器呼叫hasNext判斷是否還有元素可以獲取 3. 如果還有元素可以獲取,那麼就呼叫next方法把游標向後移動並獲取當前游標位置的元素。

注意:在使用迭代器遍歷的過程中,如果使用集合的方法對集合長度進行改變(新增,刪除),就會引發併發修改異常。

三、增強for迴圈(foreach) 在jdk1.5之後,多了新的遍歷方式,這種方式叫做增強for迴圈(foreach),一般用來遍歷陣列和集合。 格式: for(資料型別 變數名 : 容器) { … } 格式解釋: 資料型別: 容器中元素是什麼資料型別,這裡就寫什麼 變數名: 隨便起,只要滿足識別符號命名規則。這個變量表示容器中的每一個元素。 容器:可以是陣列或者集合。JDK規定實現Iterable才允許稱為增強for的目標。 注意: 增強for只是普通for的語法糖。語法糖指的是本質沒有變只不過語法更加的簡潔。 增強for遍歷陣列,本質還是使用的普通for迴圈和iterator進行的遍歷。 增強for的優缺點: 優點: 增強for省略了對索引的操作。語法更加的簡潔。 缺點: 不能獲取索引,如果要對索引進行操作,還需要使用普通for。 1. 泛型(generic)

泛型是資料型別的一部分,我們將類名與泛型合併一起看做資料型別。泛型是一種不確定的資料型別。比如 :ArrayList,這個E就是泛型,他是一種未知的,不確定的資料型別。這種未知的資料型別必須等到使用這個類的時候才能夠確定。 泛型可以省略,如果省略泛型,泛型預設是Object 泛型的好處: 1. 省略了強轉的程式碼,避免了型別強轉的麻煩。 2. 將異常從執行時時期提前到編譯時期。將執行時期的 ClassCastException,轉移到了編譯時期變成了編譯失敗。 注意:java中的泛型只在編譯時期有效。 一旦到了執行時期泛型就會消失。 俗稱泛型擦除。 泛型也稱引數型別化,就是廣泛的型別,在不同型別之間都可以使用就叫做泛型。 使用泛型,需要保證使用泛型的類具有共同的方法。 繼承和泛型不同: 1. 在一個體系中,繼承層次是垂直關係,從抽象到具體,泛型是水平方向的。 2. 用繼承,不同的類將擁有不同的介面,並獲得多型,運用泛型,將擁有不同的型別。所以使用泛型的類之間應該有共同的方法,否則使用泛型沒有意義。

1.定義和使用含有泛型的類 如果在類的後面加上泛型,這個類就變成的泛型類。直接在類的後面加上,表示在這個類上面定義了一種未知的資料型別T,當第一次使用這個類的時候,才確定這個型別到底是什麼。 定義格式: 修飾符 class 類名<代表泛型的變數> { } 例如: class ArrayList{ public boolean add(E e){ } public E get(int index){ } } 2.定義和使用含有泛型的方法 如果想要縮小泛型的範圍,延後泛型的確認時間,可以使用泛型方法。 泛型方法中的泛型的資料型別,是在呼叫方法的時候才確定的。 泛型方法定義格式: 修飾符 <泛型>返回值型別 方法名(引數型別 引數名) { … } 3、含有泛型的介面 如果把泛型定義在介面上面,那麼這個介面就是泛型介面。直接在介面名後面加上。 定義格式為: 修飾符 interface介面名<代表泛型的變數> { } 例如:public interface MyInterface { };

泛型介面的使用 1. 實現類在實現介面的時候直接就把泛型給確定出來。 例如: public class MyImplA implements MyInterface{

2. 實現類在實現介面的使用不確定泛型型別, 等到使用這個實現類的時候再確定。相當於實現類在實現介面的時候把泛型拿下來繼承下來了。

例如: public class MyImplB implements MyInterface{ 4、類繼承泛型類(格式同介面泛型一樣) 1. 子類在繼承父類的時候直接就把泛型給確定出來

public class Zi extends Fu{ 1. 子類在繼承父類的使用不確定泛型型別, 等到使用這個子類的時候再確定。相當於子類在繼承父類的時候把泛型拿下來繼承下來了。

Public class Zi extends Fu{ 1. 泛型萬用字元

當使用泛型類或者介面時,傳遞的資料中,泛型型別不確定,可以通過萬用字元<?>表示。但是一旦使用泛型的萬用字元後,只能使用Object類中的共性方法,集合中元素自身方法無法使用。 注意: 泛型之間沒有繼承關係。ArrayList 不是 ArrayList 的父類。 如果想要讓引數泛型可以匹配任意的型別。那麼可以使用泛型萬用字元 ? ? 表示泛型萬用字元,可以匹配任何型別的泛型. ?只能用作在方法引數位置被動匹配,不能主動的去使用. 泛型的限定:

? 可以匹配任何型別的泛型,這樣做很靈活,但是過於靈活有時候也不太好,所以我們可以對? 所匹配的泛型進行一個限制,這個就是泛型的限定

<? extends A>: 泛型只能是A類,或者是A類的子類。 上限。 最高到A類 <? super A>: 泛型只能是A類,或者是A類的父類。 下限。 最低是A類 泛型一般用作程式碼的重構