在List接口中,还有一个方法listIterator(int index)可以得到List的迭代器(ListIterator接口的对象),其中的参数index为迭代的起始位置,其它的同listIterator()方法得到的迭代器一样。
一、List接口
在Java中,List接口的定义如下:
- <span style="font-size:18px;">public interface List<E> extends Collection<E> {
- int size();
- boolean isEmpty();
- boolean contains(Object o);
- Iterator<E> iterator();
- Object[] toArray();
- <T> T[] toArray(T[] a);
- boolean add(E e);
- boolean remove(Object o);
- boolean containsAll(Collection<?> c);
- boolean addAll(Collection<? extends E> c);
- boolean addAll(int index, Collection<? extends E> c);
- boolean removeAll(Collection<?> c);
- boolean retainAll(Collection<?> c);
- void clear();
- boolean equals(Object o);
- int hashCode();
- E remove(int index);
- //上面的方法继承自Collection接口,下面的方法是List接口本身的扩展
- E get(int index);
- E set(int index, E element);
- int indexOf(Object o);
- int lastIndexOf(Object o);
- ListIterator<E> listIterator();
- ListIterator<E> listIterator(int index);
- List<E> subList(int fromIndex, int toIndex);
- }</span>
从定义来看,List接口除了定义了一些对List的增加,删除,修改等操作外,还有就是里面有一个ListIterator接口,当对象调用listIterator()方法时,就会得到一个ListIterator接口的对象,该接口是干什么呢?
二、ListIterator接口
在Java中,ListIterator接口的定义如下:
- <span style="font-size:18px;">public interface ListIterator<E> extends Iterator<E> {
- boolean hasNext();
- E next();
- void remove();
- boolean hasPrevious();
- E previous();
- int nextIndex();
- int previousIndex();
- void set(E e);
- void add(E e);
- }</span>
从定义可以看出,ListIterator接口是Iterator的扩展。也就是说,实现ListIterator接口的类的对象都可以使用增强for循环进行遍历。我们都知道,hashNext()和next()方法是查找后继元素的时候使用,由此可想而知,ListIterator接口中的hasPrevious()和privious()方法是用来查找前驱元素的。同时,还扩展了一个set()方法。set() 方法传递的参数E的对象,该方法是干什么用的呢?
- <span style="font-size:18px;">package ljp.lists;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Collection;
- import java.util.ListIterator;
- public class ListDemo01 {
- public static void main(String[] args) {
- List<Integer> arraylist = new ArrayList<Integer>();
- arraylist.add(1);
- arraylist.add(2);
- arraylist.add(3);
- arraylist.add(4);
- //查看arrayList中的内容
- for(int i : arraylist){
- System.out.println(i);
- }
- ListIterator<Integer> listit = arraylist.listIterator();
- listit.set(10);
- //使用过set()方法之后,查看有什么变化
- for(int i : arraylist){
- System.out.println(i);
- }
- }
- }</span>
运行上面的程序,在调用set()方法的时候,抛出IllegalStateException异常。
- <span style="font-size:18px;">1
- 2
- 3
- 4
- Exception in thread "main" java.lang.IllegalStateException
- at java.util.AbstractList$ListItr.set(AbstractList.java:408)
- at ljp.lists.ListDemo01.main(ListDemo01.java:20)</span>
为什么会抛出IllegalStateException异常呢?IllegalStateException异常是指在不合理或不正确时间内唤醒一方法时出现的异常信息。换句话说,即 Java 环境或 Java 应用不满足请求操作。也就是说,set()方法不是这么使用的。
- <span style="font-size:18px;">package ljp.lists;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Collection;
- import java.util.ListIterator;
- public class ListDemo01 {
- public static void main(String[] args) {
- List<Integer> arraylist = new ArrayList<Integer>();
- arraylist.add(1);
- arraylist.add(2);
- arraylist.add(3);
- arraylist.add(4);
- //查看arrayList中的内容
- for(int i : arraylist){
- System.out.println(i);
- }
- ListIterator<Integer> listit = arraylist.listIterator();
- while(listit.hasNext()){
- listit.next();
- listit.set(10);
- }
- //使用过set()方法之后,查看有什么变化
- for(int i : arraylist){
- System.out.println(i);
- }
- }
- }
- </span>
上面程序的运行结果为:
1
2
3
4
10
10
10
10
从结果可以看出,ListIterator接口中set()方法是将next()方法得到的元素重新赋值,当然,如果是previous()方法得到的元素也可以被赋值。
在List接口中,还有一个方法listIterator(int index)可以得到List的迭代器(ListIterator接口的对象),其中的参数index为迭代的起始位置,其它的同listIterator()方法得到的迭代器一样。