Java(7-2 迭代器和鏈表詳細說明)

下面幾回我們會介紹具體的集合:
這一節我們主要說下集合框架中的鏈表(LinkedList)。
首先,在Java中,所有的鏈表實際上都是雙向鏈表,即每個節點還存放着至向前驅結點的引用。下面是一個示例,我們會先添加三個元素,然後將第二個元素刪除:

List<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
Iterator iter = staff.iterator();
String first = iter.next();
String second = iter.next();
iter.remove();//remove the last visited element

鏈表和泛型集合有一個重要的區別,就是鏈表是一個有序集合,每個對象的位置十分重要。LinkedList.add方法將對象添加到鏈表的尾部。但是,我們有時也需要將元素添加到鏈表的中間,由於迭代器是描述結合中位置的,所以這種依賴於位置的add方法將由迭代器負責。因此,在Iterator接口中就沒有add方法,而在集合類庫的子接口ListIterator就會包含add方法:

interface ListIterator<E> extends Iterator<E>
{
    void add(E element);
    ...
}

另外,此add方法不會返回boolean類型的值,還有,ListIterator接口有兩個方法,可以用來反向遍歷鏈表:

E previous();
boolean hasPrevious();

和next方法一樣,previous返回越過的對象。
LinkList類的listIterator方法返回一個實現了ListIterator接口的迭代器對象:

ListIterator<String> iter = staff.listIterrator();

Add方法在迭代器位置之前添加一個新對象。如果多次調用add方法,將按照提供的次序把元素添加到鏈表中。它們被一次添加到迭代器當前位置之前。

add方法只依賴迭代器的位置,而remove方法依賴於迭代器的狀態
set方法用一個新的元素取代調用next或privious方法返回的上一個元素。

請遵循這樣的原則:可以根據需要給容器附加許多的迭代器,但是這些迭代器智能讀取列表。另外,再單獨附加一個既能讀也能寫的迭代器

列表迭代器接口還有一個方法,可以告之當前位置的索引。是幾扇,從概念上來講,由於Java迭代器指向兩個元素之間的位置,所以可以同時產生兩個索引:nextIndex方法返回下一次調用next方法時返回元素的整數索引;priviousIndex方法返回下一次調用previous方法時返回元素的整數索引;如果有一個整數索引n,list.listIterator(n)將會返回一個迭代器,這個迭代器指向索引爲n的元素前面的位置。也就是說調用next和調用list.get(n)會產生同一個元素,只是獲得這個迭代器的效率比較低。
最後!如果需要對集合進行隨機訪問,就使用數組或者ArrayList!

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