容器、迭代器和泛型
- 2019 年 10 月 8 日
- 筆記
知識總結:
本周主要學習了容器、迭代器以及泛型:
一、對於容器的一些理解:
ArrayList |
底層實現是數組,有序,可重複 |
---|---|
LinkedList |
底層實現是鏈表 |
Set |
底層實現是Map |
Map |
鍵值對,鍵不可以重複,值可以重複,但是後添加的值會覆蓋前一次的值 |
二、迭代器:
關於迭代器的使用,一個容器的迭代器只能使用一次。但是老師上課教會了另一種方法,在構建類的時候,可以將自定義的迭代器進行封裝為一個內部類,然後再構造相應的產生方法,這樣就可以在自定義一個容器的時候,產生多個迭代器,而不必通過構造容器來使用迭代器。
三、關於泛型的一些總結和個人理解:
泛型在使用的時候主要是根據一對尖括號<>來進行的,使用泛型的主要優點是:安全和省心。用一段代碼來進行解釋這兩個優點:
public class MyStuApp { public static void main(String[] args) { // MyStudent <int> stu = new MyStudent<int>();//自定類泛型不能為基本類型,比如此處的int MyStudent<Integer> stu = new MyStudent<Integer>(); //1、安全:類型檢查 // stu.setJavase("優秀");//在泛型中已經聲明了為Integer類型,所以此處編譯報錯 stu.setJavase(80);//此時只能存放Integer整型 //2、省心:自動轉換類型 Integer score = stu.getJavase();//取出數據的時候,可以避免類型的混亂 } }
可以明顯的看出,泛型就相當於是一個標籤,在用戶將數據丟入容器的時候,提前規定好可以存放的類型,在取出數據的時候就會是存放的類型。就好比,向一個壺裏面裝醋,如果提前在壺上打一個標籤,代表這是醋,那麼我們就不會在裝入和取出的時候將其誤以為是醬油,這就是泛型的一個作用。具體的一些可能出錯的小細節,通過老師的總結,大概記錄了一下:
1、在子類繼承泛型父類的時候,子類所繼承的泛型數量需要多於父類的泛型數量。但是如果父類已經實現了一個或多個具體的引用類型作為泛型,那麼子類就可不必實現相應的泛型。
2、泛型沒有數組和多態。在ArrayList類中,也使用了泛型,但是通過閱讀JDK源碼可以發現,ArrayList在實現過程中,使用的是一個Object[]數組,進行數組的底層實現。
3、關於泛型的擦除:泛型的擦除結合下面一段代碼進行詳解。
/*總結:當使用泛型擦除的時候,相當於是默認為一個Object類型,但是還會根據用戶加進去的參數來確定是屬於Object下面的哪一類, * 比如student是屬於泛型擦除,在編譯的時候不會進行類型檢查,向其中添加的是100,會將student轉化為Integer * 而如果將泛型設置為Object類型的話,那麼無論傳進去的參數是什麼類型,編譯器都會將其定義為Object類型,不會自動根據相應的類型來轉化 * 所以泛型的擦除只是相當於Object類型,而不是等於Object類型*/ public class MyStuApp { public static void main(String[] args) { //擦除---->沒有指定 泛型的具體類型,相當於使用的是Object類型 MyStudent student = new MyStudent(); student.setJavase(100);//100-->int-->Integer-->Object Object obj = student.getJavase(); test(student);//此處編譯可以通過,因為student屬於泛型擦除,所以在編譯的時候不會進行類型檢查 MyStudent<Object> student2 = new MyStudent<Object>();//此處直接將Mystudent的泛型改變為Object // test(student2);//編譯的時候會進行類型檢查不通過,因為student2是一個固定的Object類型,並不從屬於下面的Integer類型 } public static void test(MyStudent<Integer> stu) { //此處將MyStudent加入泛型Integer,所以在使用的時候用的就是Integer類型,而不是Object } }
所以在使用泛型的擦除的時候,相當於我們拿了一個萬能的箱子(Object),裝進去的東西,這個萬能箱會自動進行分類,而將泛型指定為這個萬能箱(Object)的時候,編譯時就會只看這個箱子的表面,而不會去關注其內涵——使用這個萬能箱自動分類的功能。所以泛型的擦除僅僅是約等於Object類型,而並非是等於Object類型。
關於容器、迭代器、以及泛型的知識點還有很多,需要我們深入其中才可以了解透徹,博主只是根據自己的學習情況,將其中一些比較有意思的點提出來,供大家分享,希望大家能夠滿意哈!有問題的話,可以留言喲!