概述
Iterator迭代器
接口 Iterator
public interface Iterator<E>
:
对 Collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:
- 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
- 方法名称得到了改进。
方法摘要 | |
---|---|
boolean | hasNext() :如果仍有元素可以迭代,则返回 true 。 |
E | next :返回迭代的下一个元素。 |
void | remove() :从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 |
子接口ListIterator
public interface ListIterator<E>
:
系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator
没有当前元素;它的光标位置始终位于调用 previous()
所返回的元素和调用 next()
所返回的元素之间。长度为 n
的列表的迭代器有 n+1
个可能的指针位置,如下面的插入符举例说明:
方法摘要 | |
---|---|
void | add(E e) :将指定的元素插入列表(可选操作)。 |
boolean | hasNext() :以正向遍历列表时,如果列表迭代器有多个元素,则返回 true (换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true )。 |
boolean | hasPrevious() :如果以逆向遍历列表,列表迭代器有多个元素,则返回 true 。 |
E | next() :返回列表中的下一个元素。 |
int | nextIndex() :返回对 next 的后续调用所返回元素的索引。 |
E | previous() :返回列表中的前一个元素。 |
int | previousIndex() :返回对 previous 的后续调用所返回元素的索引。 |
void | remove() :从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。 |
void | set(E e) :用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。 |
注意,remove()
和set(Object)
方法不是根据光标位置定义的;它们是根据对调用 next()
或 previous()
所返回的最后一个元素的操作定义的。
接下来我们对这几个方法进行使用:
//迭代器遍历输出集合
public class Demo1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()){//如果集合里有元素则继续循环
System.out.println(iterator.next());//返回光标在此位置的元素
}
}
}
答案显然为
但如果我们在遍历集合之前使用了next()
方法:
public class Demo1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
iterator.next();
iterator.next();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
答案是
因为我们执行了两次next()
方法,所以我们的光标往下移了两位,在循环里第一次next()
后光标指向集合的第三个元素。
我们使用一下ListIterator
中的add(E e)
方法:
public class Demo1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
iterator.add(100);
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
答案还是
为什么我们迭代器循环的时候,并没有将100这个值输出出来呢?但是其实他是在集合中的,只不过调用ListIterator
中的add(E e)
方法时,它将值插入到了集合的最上面,下面我们来看这个方法的具体介绍:
add(E e)
:将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous 返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素(此调用把调用 nextIndex 或 previousIndex 所返回的值增加 1)。
它将值插入在了0的位置,0下标变为1下标…以此类推。
所以接下来我们调用一下previous()
方法:
public class Demo1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> iterator = list.listIterator();
iterator.add(100);
iterator.previous();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
答案是
显然,我们输出了100这个值。
增强for循环
增强for循环本质是迭代器。
增强for循环(也称for each循环)是 JDK1.5 以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
格式:
for(元素的数据类型 变量名称 : Collection集合or数组){
//代码
}
遍历数组:
public class Demo1 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
for (int i : arr) {
System.out.println(i);
}
}
}
遍历集合:
public class Demo1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
for (Integer i : list) {
System.out.println(i);
}
}
}
小贴士:
Iterator迭代器只能遍历Collection集合。
最后
以上就是喜悦书本为你收集整理的Iterator迭代器和增强for循环Iterator迭代器增强for循环的全部内容,希望文章能够帮你解决Iterator迭代器和增强for循环Iterator迭代器增强for循环所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复