目录
Iterator
对数据只进行一次正向循环输出。
常用方法:
方法 | 说明 |
---|---|
public boolean hasNext() | 判断下一个数据是否为空 |
default void remove() | 删除数据(很难用到) |
public E next() | 获取当前数据 |
示例:
List<String> list = new ArrayList<>();
list.add("1");
list.add("3");
list.add("5");
list.add("7");
list.add("9");
list.add("2");
list.add("4");
list.add("6");
list.add("8");
list.add("10");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) { //判断下一个数据是否为空
String value = iterator.next(); //获取当前数据
if ("3".equals(value)) {
iterator.remove(); //删除数据,不会影响节点
} else {
System.out.println(value);
}
}
结果:
1
5
7
9
2
4
6
8
10
List、Set、Collection之中,List有get()方法,可以根据索引获取数据。
迭代器输出和List的get()方法:使用get()方法在输出时每一次都需要进行索引数据的匹配,时间复杂度(n+1)n,性能不强。
ListIterator(双向迭代输出)
可以对数据顺序输出、也可以对数据逆向输出。
ListIterator在内部存在一个操作的指针想要逆向输出,必须指针到达之后一个数据,在可以逆向输出,所以想要逆向输出,必须先进行正向输出。
常用方法:
方法 | 说明 |
---|---|
public boolean hasPrevious() | 判断上一个数据是否为空 |
public E previous(); | 获取数据 |
示例:
List<String> list = new ArrayList<>();
list.add("a");
list.add("c");
list.add("b");
list.add("m");
list.add("a");
list.add("d");
list.add("g");
list.add("j");
list.add("l");
list.add("q");
ListIterator<String> listIterator = list.listIterator();
System.out.print("正向输出:");
while (listIterator.hasNext()) {
System.out.print(listIterator.next() + "、");
}
System.out.print("\n反向输出:");
while (listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + "、");
}
结果:
正向输出:a、c、b、m、a、d、g、j、l、q、
反向输出:q、l、j、g、d、a、m、b、c、a、
Enumeration
早期的迭代输出器,现在只有Vector可以用到。
常用方法:
方法 | 说明 |
---|---|
public boolean hasMoreElements() | 判断下一个数据是否为空 |
public E nextElement() | 获取当前数据 |
示例:
Vector<String> vector = new Vector<>();
vector.add("a");
vector.add("b");
vector.add("c");
vector.add("d");
vector.add("e");
vector.add("f");
Enumeration<String> enumeration = vector.elements();
while(enumeration.hasMoreElements()){
System.out.println(enumeration.nextElement());
}
结果:
a
b
c
d
e
f
foreach
foreach循环输出,当自定义类对象要输出时,必须实现Iterable接口,在重写的iterator方法中返回一个iterator实例对象,所以必须在内部定义内部类实现Iterator接口。
示例: 自定义类输出
public class Demo01 {
public static void main(String[] args) {
Ball ball = new Ball();
for (String b:ball) {
System.out.print(b+"、");
}
}
}
class Ball implements Iterable<String>{
private String[] brand = new String[]{"Hello","World"};
private int footer;
@Override
public Iterator<String> iterator() {
return new BallIter();
}
private class BallIter implements Iterator<String>{
@Override
public boolean hasNext() {
//表示数组存在数据
return Ball.this.footer < Ball.this.brand.length;
}
@Override
public String next() {
//返回数据
return brand[Ball.this.footer++];
}
}
}
结果:
Hello、World、
示例: 自定义链表foreach输出
public class Demo02 {
public static void main(String[] args) {
ILink<String> link = new LinkImpl<>();
link.add("1");
link.add("2");
for (String str:link) {
System.out.println(str+"、");
}
}
}
interface ILink<T> extends Iterable<T>{
/**
*链表数据增加
* @param data 数据
*/
public void add(T data);
}
class LinkImpl<T> implements ILink<T>{
private Node root;
private Node<T> last;
private Node currentNode;
@Override
public Iterator<T> iterator() {
this.currentNode = this.root;
return new LinkIter<>();
}
private static class Node<T>{
private T data;
private Node next;
public Node() {
}
public Node(T data) {
this.data = data;
}
}
@Override
public void add(T data) {
Node<T> node = new Node<>(data);
if(this.root == null){
this.root = node;
}else{
this.last.next = node;
}
this.last = node;
}
private class LinkIter<T> implements Iterator<T>{
@Override
public boolean hasNext() {
return LinkImpl.this.currentNode!=null;
}
@Override
public T next() {
T data = (T) LinkImpl.this.currentNode.data;
LinkImpl.this.currentNode = LinkImpl.this.currentNode.next;
return data;
}
}
}
结果:
1、
2、