Iterable,Iterator和forEach
Iterable
- Interface Iterable<T>
- 方法:
- Iterator<T> iterator()
- Returns an iterator over a set of elements of type T.
- Returns:
- an Iterator.
Iterable接口有一个方法声明,方法用于获取迭代器。实现该接口的类表明可以使用foreach来遍历。实现该接口的类中的iterator()方法必须返回一个迭代器。而迭代器类通常作为内部类来实现,此内部类必须实现Iterator接口。
Iterator
- public interface Iterator<E>
- An iterator over a collection.
- 方法:
- boolean hasNext()
- Returns true if the iteration has more elements.
- E next()
- Returns the next element in the iteration.
- void remove()
- Removes from the underlying collection the last element returned by this iterator (optional operation).
实现该接口的类可以作为迭代器来迭代一个集合内的元素。实现该接口的类常常作为集合类的内部类。
forEach
对集合遍历。例如
- for(String s: arrayList){}
上面的代码会自动调用arrayList的iterator()方法获得迭代器iterator对象,故arrayList对象必须实现Iterable接口。迭代器iterator又必须实现Iterator接口,因此迭代器iterator有hasNext()和next()方法,通过这两个方法就可以实现对arrayList元素的遍历。
以下通过一段代码对上面三个知识点做一个总结,下面代码模仿一个ArrayList集合(不过下面的集合不是变长的):
- import java.util.Iterator;
- import java.util.NoSuchElementException;
- public class IterableClass<E> implements Iterable<E>{
- private int size=0;//集合包含的元素个数
- private final int capacity;//集合的最大容量
- private Object[] elementData ;
- public IterableClass(int size){
- if(size>0){
- capacity = size;
- elementData = new Object [size];
- }else{
- throw new IllegalArgumentException("集合初始化容量参数size传入非法值: "+
- size);
- }
- }
- public boolean add(E o){
- if(size<capacity){
- elementData[size]=o;
- size++;
- return true;
- }else{
- return false;
- }
- }
- @SuppressWarnings("unchecked")
- public E remove(int index) {
- E oldValue = null;
- if(index>=0 && index<size){
- oldValue = (E) elementData[index];
- int numMoved = size - index - 1;
- if (numMoved > 0)
- System.arraycopy(elementData, index+1, elementData, index,
- numMoved);
- elementData[--size] = null; // clear to let GC do its work
- return oldValue;
- }else{
- return null;
- }
- }
- @SuppressWarnings("unchecked")
- public E get(int index){
- if(index>=0&&index<size){
- return (E) elementData[index];
- }else{
- throw new IllegalArgumentException("非法参数index: "+
- index);
- }
- }
- @Override
- public Iterator<E> iterator() {
- return new Itr();
- }
- private class Itr implements Iterator<E> {
- int cursor; // index of next element to return
- int lastRet = -1; // index of last element returned; -1 if no such
- @Override
- public boolean hasNext() {
- return cursor != size;
- }
- @SuppressWarnings("unchecked")
- @Override
- public E next() {
- int i = cursor;
- if (i >= size)
- throw new NoSuchElementException();
- cursor = i + 1;
- return (E) elementData[lastRet = i];
- }
- }
- }
- 测试:
- public class Test {
- public static void main(String[] args) {
- //ArrayList a = new ArrayList(1);
- IterableClass<String> array = new IterableClass<String>(10);
- array.add("a");
- array.add("b");
- array.add("c");
- array.add("d");
- System.out.println(array.get(2));
- array.remove(2);
- for(String s: array){
- System.out.println(s);
- }
- }
- }
- 输出:
- c
- a
- b
- d
Iterable,Iterator和forEach的更多相关文章
- python中的Iterable, Iterator,生成器概念
https://nychent.github.io/articles/2016-05/about-generator.cn 这个深刻 谈起Generator, 与之相关的的概念有 - {list, s ...
- 生成器(generator)和迭代(iterable , iterator, iteration)
在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration 1.Iterable 我们知道,在Python中所有东西都是object, 比如说变量,容 ...
- java:集合输出Iterator,ListIterator,foreach,Enumeration
//集合输出,集合的四种输出 Iterator, ListIterator, foreach, Enumeration 只要碰到集合,第一输出选择是Iterator类. Iterator<E&g ...
- JDK源码学习笔记——Iterable/Iterator实现原理
Collection接口继承java.lang.Iterable接口,集合类重写了iterator()方法 public interface Iterable<T> { Iterator& ...
- java - day011 - 集合, ArrayList HashMap,HashSet, Iterator 接口, for-each 循环格式
集合 ArrayList 丑数: 能被3,5,7整除多次, ArrayList list 接口 | - ArrayList | - Linked ...
- Python Iterable Iterator Yield
可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list / tuple / dict / set / str /等(对于这类iterable的对象,因为你可以按照你的意愿进行重 ...
- Java集合框架(一)—— Collection、Iterator和Foreach的用法
1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ...
- Iterable/Iterator傻傻分不清
区别可迭代对象和迭代器 1.判断是否可以迭代 from collections import Iterabledef fid(times): n = 0 a , b = 0,1 while n < ...
- 为什么iterator,foreach遍历时不能进行remove操作?除了一种情况可以这样(特殊情况)?
Exception in thread "main" java.util.ConcurrentModificationException 并发修改异常引发的思考! 1 foreac ...
随机推荐
- Redis笔记 -- make编译安装报错记录2则(一)
1.Redis的获取与安装,目前最新稳定版本为4.0.10 Redis: https://redis.io/download GitHub: https://github.com/antirez/ ...
- c# 在WebBrowser中用SendMessage模拟鼠标点击
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ThinkPHP5.1 前置操作说明
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法. ...
- Nginx中配置http和https做反向代理
参考:http://www.zslin.com/web/article/detail/73 1.安装 sudo apt-get install nginx 2.配置: http_demo.conf # ...
- 20155334 2016-2017-2《Java程序设计》课程总结
20155334 2016-2017-2<Java程序设计>课程总结 1. 每周作业链接汇总 题目 主要内容 二维码 预备作业1 不知道所以然的第一次博客 预备作业2 有关之前的C语言的调 ...
- CF 1093 E. Intersection of Permutations
E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. ...
- STM8在IAR中Printf的整形长度问题
//ld是32位的 printf("up_intval:%ld\r\n",device_set.upload_tem); //d是16位的 printf("up_intv ...
- 向大学说拜拜——大学 > 兴趣 + 时间 + 思考 + 实践
[人物素描] 大学期间,担任过班委,加入过学生会,参加过社团,拿过奖学金......而印象最深刻的莫过于参加并组织过ACM集训,以及参加过导师的国家自然科学基金项目了.毕业时顺利拿到一波offer,并 ...
- kettle 将job等导入导出成xml
一.导出 工具->资源库->探索资源库 就可以看见资源库里面的资源了. 如果要导出资源库里面的某个目录就右键就行了. 如果要导出全部资源库的文件就如下图所示 将资源库导出其实也是一个xml ...
- _INTSIZEOF
在_INTSIZEOF中该有的都有了 1.这其中最小非负剩余和最大正余数例子如下: 设n为4,当r为1时,最小非负剩余就是1,最大非正剩余就是1 - 4 = -3,最大正余数为4 - 1 = 3 2. ...