61-集合输出

本文介绍了四种集合输出形式:Iterator迭代输出、ListIterator双向迭代输出、Enumeration枚举输出及foreach输出。详细探讨了每种输出方式的特点及使用场景,特别强调了Iterator与ListIterator在集合操作中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合输出

  集合输出实际上从JDK1.8开始就在Iterable接口之中提供有一个foreach()方法,但是这种方式的输出并不是传统意义上的输出形式,并且也很难在实际开发中出现,对于集合操作而言,一共定义有四种输出形式:

  • Iterator迭代输出(95%)
  • ListIterator双向迭代输出(0.1%)
  • Enumeration枚举输出(4.8%)
  • foreach输出(与Iterator相当)

Iterator迭代输出

  通过Collection接口的继承关系可以发现,从JDK1.5开始其多继承了一个Iterable父接口,这个接口中定义有iterator()操作方法,通过此方法可以获取Iterator接口对象(JDK1.5之前,这一方法直接定义Collection接口中)

  • 获取Iterator接口对象:public Iterator<T> iterator();

  在Iterator接口中定义有如下的方法:

方法名称类型描述
public boolean hasNext()普通判断是否有数据
public E next()普通取出当前数据
public default void remove()普通删除

  在之前使用的java.util.Scanner类就是Iterator的子类,所以此时类的继承关系如下:
6BBspt.png

使用Iterator输出

package per.lyz.demo;

import java.util.Iterator;
import java.util.Set;

public class SetOutput_Study {
	public static void main(String[] args) {
		Set<String> all = Set.of("Hello","World","test");
		Iterator<String> iter = all.iterator();		//实例化Iterator对象
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

  但是对于Iterator接口中的remove()方法的使用需要特别注意(如果不是必须不要使用)。实际上Collection接口中定义有数据的删除方法,但是在进行迭代输出的过程中如果使用了Collection中的remove()方法会导致迭代失败(JDK14成功输出)。
  两种remove()操作都会删除原始集合中的数据;
面试:解释Collection.remove()与Iterator.remove()的区别

  • 在进行迭代输出的时候如果使用了Collection中的remove()会造成并发更新异常,导致程序删除出错,此时只能使用Iterator.remove()方法实现正常删除处理。

ListIterator双向迭代输出

  使用Iterator进行的迭代输出操作有一个特点,只允许由前向后实现输出,而如果是现在需要进行双向迭代处理,就必须依靠Iterator子接口:ListIterator接口实现。

  需要注意的是,如果想要获取ListIterator接口对象Collection并没有定义相关处理方法,但是List子接口有,也就是说这个输出接口是专门为了List准备的。
6B6Vqf.png
  ListIterator接口中定义有如下操作方法:

  • 判断是否有前一个元素:public boolean hasPrevious();
  • 获取当前元素:public E previous();

实现双向迭代

package per.lyz.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class SetOutput_Study {
	public static void main(String[] args) {
		List<String> all = new ArrayList<String>();
		all.add("Hello");
		all.add("World");
		all.add("test");
		ListIterator<String> iter = all.listIterator();		//实例化ListIterator对象
		System.out.println("********前-后*********");
		while(iter.hasNext()) {
			System.out.println(iter.next() + ",");
		}
		System.out.println("********后-前*********");
		while(iter.hasPrevious()){
			System.out.println(iter.previous()+ ",");
		}
	}
}

  如果要想实现由后向前的变量,那么首先要做的是由前向后的遍历。

Enumeration枚举输出

  Enumeration是在JDK1.0就使用的输出接口,这个输出接口主要是为了Vector类提供服务的,随着JDK发展Enumeration依旧只为Vector一个类服务,如果想要获取Enumeration接口对象就必须依靠Vector类提供的方法:

  • 获取Enumeration:public Enumeration<E> elements();

6BgKvn.png
  在Enumeration接口中定义有两个操作方法:

  • 判断是否有下一个元素:public boolean hasMoreElements()
  • 获取当前元素:public E nextElement();

使用Enumeration实现输出

package per.lyz.demo;

import java.util.Enumeration;
import java.util.Vector;

public class SetOutput_Study {
	public static void main(String[] args) {
		Vector<String> all = new Vector<String>();
		all.add("Hello");
		all.add("World");
		all.add("test");
		Enumeration<String> enu = all.elements();
		while (enu.hasMoreElements()) {
			System.out.println(enu.nextElement() + ",");
		}
	}
}

  由于该接口出现的时间较早,所以一些比较早的开发过程中,也有部分方法只支持Enumeration输出操作,但是随着类方法的不断完善,大部分的操作都直接利用Iterator实现

foreach输出

  除了使用迭代接口实现输出之外,从JDK1.5开始加强型for循环也可以实现集合的输出了。这种的输出形式与数组输出的操作形式类似。

使用foreach输出

package per.lyz.demo;

import java.util.ArrayList;
import java.util.List;

public class SetOutput_Study {
	public static void main(String[] args) {
		List<String> all = new ArrayList<String>();
		all.add("Hello");
		all.add("World");
		all.add("test");
		for(String str : all) {
			System.out.println(str);
		}
	}
}

  这种输出最初出现的时候并不建议使用,因为标准的集合操作还是应该以Iterator为主,但是毕竟JDK1.5都已经推出10多年了,很多语法也都被大部分人习惯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值