Java算法及JDK源码探究|Java 集合的输出 (Iterator, ListIterator, Enumeration, foreach)


文章目录

  • 1. 迭代输出 : Iterator (95%)
    • 案例: 标准的 Iterator 使用
    • 案例: 删除元素
  • `以后见到了结合输出的问题, 不需要思考直接使用 Iterator 接口`
  • 2. ListIterator 双向迭代接口 (0.01%)
    • 观察 ListIterator 接口的使用
  • 3. Enumeration 枚举输出 (4.8 %)
  • ==但是要如果取得这个接口的实例化对象, 是不可能依靠 Collection, List, Set 等接口的, 只能够依靠 Vector 子类, 因为 Enumeration 最早就是为 Vector 设计服务的== 在Vector 类中提供有一个取得 Enumeration 对象的方法 : `public Enumeration elements() `
    • 范例: 使用 Enumeration 输出 :
  • 一些操作的类库上, 依然只支持 Enumeration, 而不支持 Iterator, 虽然很少, 但是开发中会使用到.
  • 4. 新的输出: foreach (0.1 %)
    • 范例: 直接使用 foreach 输出
  • 总结:

在之前使用集合输出的时候都利用了toString(), 或者是利用了List接口中的get()方法, 但是这些都不是集合的标准的输出模式.
如果从标准上说, 集合的输出一共有四种手段
  1. Iterator (核心)
  2. ListIterator
  3. Enumeration
  4. foreach
1. 迭代输出 : Iterator (95%) 在JDK1.5之前, Collection 接口中就定义有 iterator() 方法, 通过此方法可以取得 Iterator接口的实例化对象, 而在 JDK1.5 之后, 将此方法提升为 Iterable 接口中的方法, 但是不管你如何提升, 必须清楚 Collection 有这个方法, 那么 List, Set 一定有此方法.
对于 Iterator 接口最初的设计, 里面实际上有三个抽象方法:
  1. 判断是否有下一个元素: public boolean hasNext() ;
  2. 取得当前的一个元素: public E next() ;
  3. 删除元素: public default void remove() ; 此方法从 JDK1.8 开始变成一个 default 的完整的方法了
案例: 标准的 Iterator 使用
package com.beyond.nothing; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class test {public static void main(String[] args) {List> all = new ArrayList>(); all.add("Hello"); all.add("Hello"); all.add("World"); Iterator> iter = all.iterator(); // 实例化 Iterator接口对象 while (iter.hasNext()){String str = iter.next(); System.out.println(str); } }}

对于 Iterator 接口中提供的 remove() 方法, 主要解决的就是集合内容的删除操作(真没什么用).
案例: 删除元素
package com.beyond.nothing; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class test {public static void main(String[] args) {List> all = new ArrayList>(); all.add("Hello"); all.add("Hello"); all.add("o"); all.add("World"); Iterator> iter = all.iterator(); // 实例化 Iterator接口对象 while (iter.hasNext()) {String str = iter.next(); if ("o".equals(str)){//all.remove("o"); // 如果使用此操作, 则删除了 后面被中断执行 iter.remove(); // 删除后, 代码可以继续执行 continue; } System.out.println(str); } }}

集合的核心功能在于数据的增加和数据的取出, 所以对于这种删除的操作根本没有意义, 开发中可能使用到的机率为 0;
以后见到了结合输出的问题, 不需要思考直接使用 Iterator 接口 2. ListIterator 双向迭代接口 (0.01%) Iterator 输出接口有一个特点: 只能够由前先后进行内容的迭代处理, 而如果要进行双向迭代, 那么就必须依靠 Iterator 的子接口 ListIterator 来实现.
首先来观察一下此接口定义的方法:
  1. 判断是否有上一个元素: public boolean hasPrevious() ;
  2. 取得当前元素 : public E previous() ;
Iterator 接口的对象是由 Collection 接口支持的, 但是 ListIterator 是由 List 接口支持的
List 接口提供有如下方法:
取得ListIterator 接口对象 : public ListIterator listIterator() ;
观察 ListIterator 接口的使用
package com.beyond.nothing; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class test {public static void main(String[] args) {List> all = new ArrayList>(); all.add("Hello"); all.add("Hello"); all.add("o"); all.add("World"); ListIterator> iter = all.listIterator(); System.out.println("从前向后输出!"); while (iter.hasNext()) {System.out.print(iter.next() + ","); }System.out.println("\n从后向前输出!"); while (iter.hasPrevious()) {System.out.print(iter.previous() + ","); } }}

Java算法及JDK源码探究|Java 集合的输出 (Iterator, ListIterator, Enumeration, foreach)
文章图片

如果要实现有后向前的输出, 那么应该首先进行有前到后的输出, 否则无法实现双向.

3. Enumeration 枚举输出 (4.8 %) 在 JDK 1.0 的时候就引入了 Enumeration 输出接口, 而在 JDK 1.5 的时候也针对其也做了更正, 主要是追加了其对泛型的应用.
首先来观察 Enumeration 接口定义:
  1. 判断是否有下一个元素: public boolean hasMoreElements() 重点重点重点
  2. 取得元素: public E nextElement() ; 重点重点重点
但是要如果取得这个接口的实例化对象, 是不可能依靠 Collection, List, Set 等接口的, 只能够依靠 Vector 子类, 因为 Enumeration 最早就是为 Vector 设计服务的
在Vector 类中提供有一个取得 Enumeration 对象的方法 :
public Enumeration elements() 范例: 使用 Enumeration 输出 :
package com.beyond.nothing; import java.util.*; public class test {public static void main(String[] args) {Vector> all = new Vector>(); all.add("Hello"); all.add("Hello"); all.add("o"); all.add("World"); Enumeration> enu = all.elements(); while (enu.hasMoreElements()){System.out.println(enu.nextElement()); }}}

一些操作的类库上, 依然只支持 Enumeration, 而不支持 Iterator, 虽然很少, 但是开发中会使用到. 4. 新的输出: foreach (0.1 %) 从JDK 1.5 开始 foreach可以输出数组, 实际上除了数组之外, 还可以输出集合操作, 不过对于初学者而言不建议这样处理.
范例: 直接使用 foreach 输出
package com.beyond.nothing; import java.util.*; public class test {public static void main(String[] args) {Vector> all = new Vector>(); all.add("Hello"); all.add("Hello"); all.add("o"); all.add("World"); for (String str : all) {System.out.println(str); }} }

【Java算法及JDK源码探究|Java 集合的输出 (Iterator, ListIterator, Enumeration, foreach)】如果从代码的本质上来讲,此处是少了一个对象, 但是 Iterator 只是一个输出对象, 而所有的内容都是在集合本身, 所以这个输出对象所占用的空间不算什么.
总结:
  1. 看见集合输出就使用 Iterator 就行了
  2. Iterator 和 Enumeration 接口中的方法一定要掌握牢固.

    推荐阅读