集合的迭代器

任何集合都有迭代器。

任何集合类,都必须能以某种方式存取元素,否则这个集合容器就没有任何意义。

迭代器,也是一种模式(也叫迭代器模式)。在java中它是一个对象,其目的是遍历并选中其中的每个元素,而使用者(客户端)无需知道里面的具体细节。迭代器要足够的“轻量”——创建迭代器的代价小。所以看迭代器的源代码就会发现,里面会有很多要求:

  1. iterator方法返回一个Iterator,Iterator返回序列的头元素。
  2. next方法获取下一个元素
  3. hasNext检查还有元素
  4. remove删除迭代器新返回的元素

下面是迭代器的基本使用

public class UsingIterator {
public static void main(String[] args) {
List<String> names = Arrays.asList("marson", "shine", "summer", "zhu");
Iterator<String> it = names.iterator();
while(it.hasNext()){
String s = it.next();
print(s);
}
for (String s : names){
print(s);
}
System.out.println();
it = names.iterator();
for (int i = 0; i < 4; i++) {
it.next();
}
print(names);
}
}

ListIterator

ListIterator是一个更强大的Iterator子类型,能用于各种List类访问,前面说过Iterator支持单向取数据,ListIterator可以双向移动,所以能指出迭代器当前位置的前一个和后一个索引,可以用set方法替换它访问过的最后一个元素。我们可以通过调用listIterator方法产生一个指向List开始处的ListIterator,并且还可以用过重载方法listIterator(n)来创建一个指定列表索引为n的元素的ListIterator。

public class ListIteration {
public static void main(String[] args) {
var names = Arrays.asList("marson", "shine", "summer", "zhu");
var it = names.listIterator();
while (it.hasNext()) {
print(it.next() + ", " + it.nextIndex() + ", " + it.previousIndex() + "; ");
} while (it.hasPrevious()) {
print(it.previous() + " ");
}
print(names); it = names.listIterator(3);
while (it.hasNext()) {
it.next();
it.set("alias");
}
print(names);
}
}

输出结果为:


marson, 1, 0;

shine, 2, 1;

summer, 3, 2;

zhu, 4, 3;

zhu

summer

shine

marson

[marson, shine, summer, zhu]

[marson, shine, summer, alias]

Iterator模式

前面说了,迭代器又叫迭代器模式,顾名思义,只要符合这种模式都能叫迭代器模式,自然也能像前面一样使用迭代器

那么Iterator模式具体是个什么样子的模式呢?

我们通过Collection的源码发现其中的样子(为什么要看Collection而不是其他的List?因为Collection是所有容器的基类啊)

通过Collection代码我们发现它继承了一个叫Iterable<T>接口,注解说的很清楚——实现这个接口就说明这个对象是可迭代的;并且其成员函数也很清晰,只有三个方法

public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action); //省略部分代码
default Spliterator<T> spliterator(); //省略部分代码

public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
...

Iterator这个泛型接口才是我们真正实现迭代的核心,通过这些信息我们尝试来写一个迭代器

public class CustomIterator implements Iterable<String> {
protected String[] names = ("marson shine summer zhu").split(" ");
public Iterator<String> iterator() {
return new Iterator<String>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < names.length;
}
@Override
public String next() {
return names[index++];
}
public void remove() {
}
};
}
public static void main(String[] agrs) {
for (var s : new CustomIterator()) {
print(s + " ");
}
}
}

到这里,自定义的迭代器就写完了,实际上我们只需要继承一个Iterable接口然后实现这个接口就行了,更深入的话,其实还可以自己写一个listIterator实现双向的操作数据

Java中的集合迭代器的更多相关文章

  1. Java 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

  2. 菜鸟日记之 java中的集合框架

    java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...

  3. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  4. Java中的集合框架(上)

    Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...

  5. Java中各种集合(字符串类)的线程安全性!!!

    Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...

  6. java中的集合和视图

    一.集合的概念 何为集合,集合就是相当于一个对象的容器.集合是类似数组的一个作用.既然有了数组,为何还要有集合呢,由于数组对象一旦创建,其大小便不可以更改,我们只能往数组中存放创建时数量的对象.而集合 ...

  7. Java中的集合(十五) Iterator 和 ListIterator、Enumeration

    Java中的集合(十五) Iterator 和 ListIterator.Enumeration 一.Iterator (一).简介 Iterator 是一个接口,它是集合的迭代器.集合可以通过Ite ...

  8. Java中的集合(十三) 实现Map接口的Hashtable

    Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...

  9. Java中的集合(十一) 实现Map接口的TreeMap

    Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...

随机推荐

  1. python模块:time

    # encoding: utf-8 # module time # from (built-in) # by generator 1.145 """ This modul ...

  2. Git使用方法(精心整理,绝对够用)转载

    Git使用方法(精心整理,绝对够用)   一.git客户端(本地仓库)的一些操作 1.设置账户(需要和github账户设置一致) git config --global user.name xxx g ...

  3. 第41章:MongoDB-集群--Sharding(分片)

    ①Sharding分片概念 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载. 分片是每个分 ...

  4. Cura - CuraEngine - 架构分析

    参考: https://blog.csdn.net/justdoithai/article/details/52746094

  5. Solutions and Summay for Linked List Naive and Easy Questions

    1.Remove Linked List Elements package linkedlist; /* * Question: Remove all elements from a linked l ...

  6. 利用ADO打开Access数据(64位系统)

    64位的access一定要用64的程序才能正确打开,仍然用"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Test.accdb;Persist ...

  7. centoos内核升级

    1.检查当前CentOS内核版本 uname -r 2.导入key 打开http://elrepo.org/tiki/tiki-index.php 复制执行该命令 3.安装ELRepo 打开2步中的网 ...

  8. python(32)——【shelve模块】【xml模块】

    一. shelve模块 json和pickle模块的序列化和反序列化处理,他们有一个不足是在python 3中不能多次dump和load,shelve模块则可以规避这个问题. shelve模块是一个简 ...

  9. 【xsy2332】Randomized Binary Search Tree DP+FFT

    题目大意:给你一个$[0,1]$之间等概率随机序列,你需要把这个序列插入到一棵$treap$中,问这棵$treap$的期望深度,请对于$[1,n]$中的每个深度分别输出它的概率(实数,保留五位小数). ...

  10. conda环境里安装pydot

    一.conda环境里安装pydot, 输入以下命令即可: conda install -c anaconda pydot 二.如果运行tensorflow,提示缺什么包,都可以在这里下载. ----- ...