容器、迭代器和泛型

  • 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類型。

關於容器、迭代器、以及泛型的知識點還有很多,需要我們深入其中才可以了解透徹,博主只是根據自己的學習情況,將其中一些比較有意思的點提出來,供大家分享,希望大家能夠滿意哈!有問題的話,可以留言喲!