12 爲什麼要有容器,容器與數組的區別,爲什麼會有迭代器

00 爲什麼要有容器?

我知道有數組,但數組有一個弊端,它是固定的,不可變。這個經常會導致出現數組越界導常的錯誤。並且還需要事先知道這個數組的長度纔可以定義。

但很多時候,我們並不知道未來將會發生什麼,所以我們創造了容器,它是不固定的,可變的,可以根據元素的增加而增加,每次增加原數組的1.5倍。爲什麼是1.5倍呢,因爲2倍太大了,1倍太小,所以爲了保證效率,擇中選1.5倍。

數組與容器的區別?

  • 數組能存基礎數據類型,也可以存引用數據類型;容器只能存引用數據類型
  • 數組的長度是固定的,容器的長度可以根據元素的增加而增加

01 爲什麼會有迭代器?

數組有的功能,容器大部分都會有。數組存放數據可能是有序的,也可能是無序的。所以容器也具備同樣的功能,容器英文:Collection,有序的表示爲List,即鏈表結構,無序的表示爲Set,即想在哪建立就在哪建立。

問題來了,有序的List,我們可以通過索引來遍歷數組。但無序的Set怎麼辦?

先展示一下有序的List通過size()以及get()方法來遍歷數組

public static void demo3() {
    List list = new ArrayList();
    list.add(new Student("aa",12));
    list.add(new Student("bb",13));
    list.add(new Student("cc",14));
    list.add(new Student("dd",15));

    for(int i = 0; i < list.size(); i++) {
        Student stu = (Student) list.get(i);
        System.out.println(stu.getName() + "," +stu.getAge());
    }
}

解決辦法:分開建立兩個方法不就可以了麼。

比如:List就建立一個ListIterator類(如果不考慮命名規範,這個名字可以隨便定義啦),Set就再建立一個SetIterator類,我們說Java是面向對象編程,這是一種抽象編程,換句話說,就是對具體類的依賴性最小。所以,爲了解決這樣的問題,我們就會將這些類抽象出來,建立Iterator類,這也就是爲什麼會有Iterator迭代器的原因了。

用一句話總結:Iterator類的訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到循環遍歷集合的效果。

爲了達到抽象,我們將共同的方法給抽象出來,Iterator類就只有三個方法了,hasNext()、next()、remove()。不同的集合再由子類去重寫這三種方法,而對於使用者來說,不用管是怎麼實現的,直接調用就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章