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<String> all = new ArrayList<String>();
        all.add("Hello");
        all.add("Hello");
        all.add("World");

        Iterator<String> 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<String> all = new ArrayList<String>();
        all.add("Hello");
        all.add("Hello");
        all.add("o");
        all.add("World");

        Iterator<String> 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<String> all = new ArrayList<String>();
        all.add("Hello");
        all.add("Hello");
        all.add("o");
        all.add("World");
        ListIterator<String> 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 集合的输出 (Iterator, ListIterator, Enumeration, foreach)_第1张图片

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

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<String> all = new Vector<String>();
        all.add("Hello");
        all.add("Hello");
        all.add("o");
        all.add("World");
        Enumeration<String> 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<String> all = new Vector<String>();
        all.add("Hello");
        all.add("Hello");
        all.add("o");
        all.add("World");

        for (String str : all) {
     
            System.out.println(str);
        }

    }
}

如果从代码的本质上来讲,此处是少了一个对象, 但是 Iterator 只是一个输出对象, 而所有的内容都是在集合本身, 所以这个输出对象所占用的空间不算什么.

总结:

  1. 看见集合输出就使用 Iterator 就行了
  2. Iterator 和 Enumeration 接口中的方法一定要掌握牢固.

你可能感兴趣的:(Java算法及JDK源码探究,日常小知识随笔,我的百宝箱,java,集合)