迭代器中知识点的总结
迭代器(Iterator)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。
迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
Iterator接口定义的方法
(1) 使用方法Iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
注意: 如果没有下一个元素时,调用next元素会抛出NoSuchElementException
(3) 使用hasNext()检查序列中是否还有元素。--------boolean hasNext() 如果仍有元素可以迭代,则返回 true。(换句话说,如果 next 返回了元素而不是抛出异常,则返回 true)。
(4) 使用remove()将迭代器新返回的元素删除。--------void remove() 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
该类主要用于遍历集合对象,该类描述了遍历集合的常见方法
1:java.lang. Itreable
---| Itreable 接口 实现该接口可以使用增强for循环
---| Collection 描述所有集合共性的接口
---| List接口 可以有重复元素的集合
---| Set接口 不可以有重复元素的集合
注:为什么next方法的返回类型是Object的呢?
为了可以接收任意类型的对象,那么返回的时候,不知道是什么类型的就定义为object。
Iterator遍历的方法
while循环:
1 public static void main(String[] args) { 2 ArrayList list = new ArrayList(); 3 // 增加:add() 将指定对象存储到容器中 4 list.add("iOS "); 5 list.add("JavaScript"); 6 list.add("c++"); 7 list.add("mysqual"); 8 list.add("java"); 9 System.out.println(list); 10 Iterator it = list.iterator(); 11 while (it.hasNext()) { 12 String next = (String) it.next(); 13 System.out.println(next); 14 } 15 }
for循环:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 4 public class Demo2 { 5 public static void main(String[] args) { 6 ArrayList list = new ArrayList(); 7 // 增加:add() 将指定对象存储到容器中 8 list.add("计算机网络"); 9 list.add("现代操作系统"); 10 list.add("java编程思想"); 11 list.add("java核心技术"); 12 list.add("java语言程序设计"); 13 System.out.println(list); 14 15 for (Iterator it = list.iterator(); it.hasNext();) { 16 //迭代器的next方法返回值类型是Object,所以要记得类型转换。 17 String next = (String) it.next(); 18 System.out.println(next); 19 } 20 } 21 }
注:需要取出所有元素时,可以通过循环,java 建议使用for 循环,因为可以对内存进行一下优化。
使用迭代器清空集合:
1 public class Demo1 { 2 public static void main(String[] args) { 3 Collection coll = new ArrayList(); 4 coll.add("aaa"); 5 coll.add("bbb"); 6 coll.add("ccc"); 7 coll.add("ddd"); 8 System.out.println(coll); 9 Iterator it = coll.iterator(); 10 while (it.hasNext()) { 11 it.next(); 12 it.remove(); 13 } 14 System.out.println(coll); 15 } 16 }
注:1、如果迭代器的指针已经指向了集合的末尾,那么如果再调用next()会返回NoSuchElementException异常。
2、如果调用remove之前没有调用next是不合法的,会抛出IllegalStateException。
迭代器原理:
1 import java.util.ArrayList; 2 import java.util.Collection; 3 import java.util.Iterator; 4 public class Demo3 { 5 public static void main(String[] args) { 6 Collection coll = new ArrayList(); 7 coll.add("aaa"); 8 coll.add("bbb"); 9 coll.add("ccc"); 10 coll.add("ddd"); 11 System.out.println(coll); 12 Iterator it = coll.iterator(); 13 while (it.hasNext()) { 14 it.next(); 15 it.remove(); 16 coll.add("abc"); // 出现了迭代器以外的对元素的操作 17 } 18 System.out.println(coll); 19 } 20 }
注意:1、在对集合进行迭代过程中,不允许出现迭代器以外的对元素的操作,因为这样会产生安全隐患,java会抛出异常并发修改异常(ConcurrentModificationException),普通迭代器只支持在迭代过程中的删除动作。
2、ConcurrentModificationException: 当一个集合在循环中即使用引用变量操作集合又使用迭代器操作集合对象, 会抛出该异常。
3、如果是List集合,想要在迭代中操作元素可以使用List集合的特有迭代器ListIterator,该迭代器支持在迭代过程中,添加元素和修改元素。
List特有的迭代器ListIterator
public interface ListIterator extends Iterator
ListIterator<E> listIterator()
----| Iterator
hasNext()
next()
remove()
------| ListIterator Iterator子接口 List专属的迭代器
add(E e) 将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有)
void set(E o) 用指定元素替换 next 或 previous 返回的最后一个元素
hasPrevious() 逆向遍历列表,列表迭代器有多个元素,则返回 true。
previous() 返回列表中的前一个元素。
注: Iterator在迭代时,只能对元素进行获取(next())和删除(remove())的操作。
对于 Iterator 的子接口ListIterator 在迭代list 集合时,还可以对元素进行添加(add(obj)),修改set(obj)的操作。
实例演示:
1 import java.util.ArrayList; 2 import java.util.ListIterator; 3 4 public class Demo2 { 5 public static void main(String[] args) { 6 ArrayList list = new ArrayList(); 7 // 增加:add() 将指定对象存储到容器中 8 list.add("iOS 10"); 9 list.add("JavaScript"); 10 list.add("c++"); 11 list.add("java"); 12 list.add("mysqual"); 13 System.out.println(list); 14 // 获取List专属的迭代器 15 ListIterator lit = list.listIterator(); 16 17 while (lit.hasNext()) { 18 String next = (String) lit.next(); 19 System.out.println(next); 20 } 21 22 //倒序遍历 23 /* 24 System.out.println("***************"); 25 while (lit.hasPrevious()) { 26 String next = (String) lit.previous(); 27 System.out.println(next); 28 } 29 */ 30 31 } 32 }
Set方法:用指定元素替换 next 或 previous 返回的最后一个元素
1 import java.util.ArrayList; 2 import java.util.ListIterator; 3 4 public class Demo2 { 5 public static void main(String[] args) { 6 ArrayList list = new ArrayList(); 7 // 增加:add() 将指定对象存储到容器中 8 list.add("计算机网络"); 9 list.add("现代操作系统"); 10 list.add("java编程思想"); 11 list.add("java核心技术"); 12 list.add("java语言程序设计"); 13 System.out.println(list); 14 15 ListIterator lit = list.listIterator(); 16 lit.next(); // 计算机网络 17 lit.next(); // 现代操作系统 18 System.out.println(lit.next()); // java编程思想 19 //用指定元素替换 next 或 previous 返回的最后一个元素 20 lit.set("平凡的世界");// 将java编程思想替换为平凡的世界 21 System.out.println(list); 22 23 } 24 }
add方法将指定的元素插入列表,该元素直接插入到 next 返回的元素的后
1 public class Demo2 { 2 public static void main(String[] args) { 3 ArrayList list = new ArrayList(); 4 // 增加:add() 将指定对象存储到容器中 5 list.add("计算机网络"); 6 list.add("现代操作系统"); 7 list.add("java编程思想"); 8 list.add("java核心技术"); 9 list.add("java语言程序设计"); 10 System.out.println(list); 11 12 ListIterator lit = list.listIterator(); 13 lit.next(); // 计算机网络 14 lit.next(); // 现代操作系统 15 System.out.println(lit.next()); // java编程思想 16 // 将指定的元素插入列表,该元素直接插入到 next 返回的元素的后 17 lit.add("平凡的世界");// 在java编程思想后添加平凡的世界 18 System.out.println(list); 19 20 } 21 }