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!

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