---------------迭代器 Iterator----------------
任何容器类,都必须有某种方式可以插入元素并将它们再次返回。毕竟,持有事物是容器最基本的工作。
现在思考两个问题:
1、如果原本是对List编码的,但是后来如果要将相同的代码很方便的移植到Set,此时应该怎么做?
2、如果打算从头开始编写通用的代码,它们只是使用容器,但是不关心容器的具体类型,那么要如何才能做到不重 写代码就能够应用于不同类型的容器呢?
迭代器的概念就能够达到此目的。
2)使用next()获取序列的下一个元素。
3)使用hasNext()来检测序列中是否还有元素。
4)使用remove()将迭代器新近返回的元素删除。
------------------ListItarator---------------
ListIterator是一个更加强大的Iterator的子类型 , 它只能用于List类的访问 。
尽管Iterator只能够向前移动,但是ListItarator可以双向移动。
可用的方法:
1)使用hasNext()来检测序列中是否还有元素。
2)使用next()获取序列的下一个元素。
3)使用hasPrevious()来检测序列中是否有上一个元素。
4)使用previous()获取序列的上一个元素。
5)set()方法替换它访问过的最后一个元素。
6)listIterator()方法产生一个指向List开始处的ListIterator。
任何容器类,都必须有某种方式可以插入元素并将它们再次返回。毕竟,持有事物是容器最基本的工作。
对于List可以有add()方法来完成插入元素的操作,get()方法来完成获取元素的操作。
现在思考两个问题:
1、如果原本是对List编码的,但是后来如果要将相同的代码很方便的移植到Set,此时应该怎么做?
2、如果打算从头开始编写通用的代码,它们只是使用容器,但是不关心容器的具体类型,那么要如何才能做到不重 写代码就能够应用于不同类型的容器呢?
迭代器的概念就能够达到此目的。
Java的Iterator只能够单向移动,从而这个Iterator只能够用来做以下的事情:
1)使用iterator()方法要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。2)使用next()获取序列的下一个元素。
3)使用hasNext()来检测序列中是否还有元素。
4)使用remove()将迭代器新近返回的元素删除。
------------------ListItarator---------------
ListIterator是一个更加强大的Iterator的子类型 , 它只能用于List类的访问 。
尽管Iterator只能够向前移动,但是ListItarator可以双向移动。
可用的方法:
1)使用hasNext()来检测序列中是否还有元素。
2)使用next()获取序列的下一个元素。
3)使用hasPrevious()来检测序列中是否有上一个元素。
4)使用previous()获取序列的上一个元素。
5)set()方法替换它访问过的最后一个元素。
6)listIterator()方法产生一个指向List开始处的ListIterator。
7)listIterator(n)方法产生一个指向列表索引为n的元素处的ListIterator。
package com.lj95801.jihelei;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.junit.Test;
/*
* ---------------迭代器 Iterator----------------
* 任何容器类,都必须有某种方式可以插入元素并将它们再次返回。毕竟,持有事物是容器最基本的工作。
* 对于List可以有add()方法来完成插入元素的操作,get()方法来完成获取元素的操作。
* 如果从更高的角度思考,会发现这里有个缺点:要使用容器,就必须对容器的确切类型编程。
*
* 现在思考两个问题:
* 1、如果原本是对List编码的,但是后来如果要将相同的代码很方便的移植到Set,此时应该怎么做?
* 2、如果打算从头开始编写通用的代码,它们只是使用容器,但是不关心容器的具体类型,那么要如何才能做到不重写代码就能够应用于不同类型的容器呢?
* 迭代器的概念就能够达到此目的。
*
* Java的Iterator只能够单向移动,从而这个Iterator只能够用来做以下的事情:
* 1)使用iterator()方法要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
* 2)使用next()获取序列的下一个元素。
* 3)使用hasNext()来检测序列中是否还有元素。
* 4)使用remove()将迭代器新近返回的元素删除。
*
* ------------------ListItarator---------------
* ListIterator是一个更加强大的Iterator的子类型,它只能用于List类的访问。
* 尽管Iterator只能够向前移动,但是ListItarator可以双向移动。
* 可用的方法:
* 1)使用hasNext()来检测序列中是否还有元素。
* 2)使用next()获取序列的下一个元素。
* 3)使用hasPrevious()来检测序列中是否有上一个元素。
* 4)使用previous()获取序列的上一个元素。
* 5)set()方法替换它访问过的最后一个元素。
* 6)listIterator()方法产生一个指向List开始处的ListIterator。
* 7)listIterator(n)方法产生一个指向列表索引为n的元素处的ListIterator。
*/
public class test_Iterator_ListIterator {
@Test
public void test_Iterator() {
//下面用三种方法来添加list链表
List<Person> list =
new ArrayList<Person>(Arrays.asList(new Person("小明",23), new Person("李雷",24)));
Person[] pers = {new Person("韩梅",21),new Person("露西",20)};
list.addAll(Arrays.asList(pers));
Person p = new Person("小花",30);
list.add(p);
//用Iterator来操作list,可以利用hasNext()和next()方法配合来遍历整个list链表
Iterator<Person> it = list.iterator();//使用iterator()方法要求容器返回一个Iterator
while(it.hasNext()){
Person person = it.next();
System.out.println(person);
}
System.out.println("------------->");
//remove()方法
it = list.iterator(); //让it指针回归,此时it指向所有元素的前面
it.next(); //此时it指向第一个元素
it.remove(); //删除it指向的那个元素,也就是第一个元素
System.out.println(list);
}
@Test
public void test_ListIterator(){
List<Student> list =
new ArrayList<Student>(Arrays.asList(new Student("小明",23,97.5f), new Student("李雷",24,98)));
list.add(new Student("小华",20,80.5f));
list.add(new Student("小曼",24,80.5f));
//指向索引值为1的Iterator,实际上指向的是索引值为0的元素。
ListIterator<Student> lit = list.listIterator(1);
while(lit.hasNext()){
System.out.println(lit.next());
}
System.out.println("---------->");
//访问过的最后一个元素是列表中的最后一个元素。现在将其修改为Lily。
lit.set(new Student("Lily",19,70));
while(lit.hasPrevious()){
System.out.println(lit.previous());
}
}
}
测试单元的运行结果:
@Test
public void test_Iterator()
测试单元的运行结果:
@Test
public void test_ListIterator()