Iterable

  1. Interface Iterable<T>
  2. 方法:
  3. Iterator<T> iterator()
  4.  
  5. Returns an iterator over a set of elements of type T.
  6.  
  7. Returns:
  8. an Iterator.

Iterable接口有一个方法声明,方法用于获取迭代器。实现该接口的类表明可以使用foreach来遍历。实现该接口的类中的iterator()方法必须返回一个迭代器。而迭代器类通常作为内部类来实现,此内部类必须实现Iterator接口。

Iterator

  1. public interface Iterator<E>
  2. An iterator over a collection.
  3.  
  4. 方法:
  5. boolean hasNext()
  6.   Returns true if the iteration has more elements.
  7. E next()
  8.   Returns the next element in the iteration.
  9. void remove()
  10.   Removes from the underlying collection the last element returned by this iterator (optional operation).

实现该接口的类可以作为迭代器来迭代一个集合内的元素。实现该接口的类常常作为集合类的内部类。

forEach

对集合遍历。例如

  1. for(String s: arrayList){}

上面的代码会自动调用arrayList的iterator()方法获得迭代器iterator对象,故arrayList对象必须实现Iterable接口。迭代器iterator又必须实现Iterator接口,因此迭代器iterator有hasNext()和next()方法,通过这两个方法就可以实现对arrayList元素的遍历。

以下通过一段代码对上面三个知识点做一个总结,下面代码模仿一个ArrayList集合(不过下面的集合不是变长的):

  1. import java.util.Iterator;
  2. import java.util.NoSuchElementException;
  3.  
  4. public class IterableClass<E> implements Iterable<E>{
  5. private int size=0;//集合包含的元素个数
  6. private final int capacity;//集合的最大容量
  7. private Object[] elementData ;
  8.  
  9. public IterableClass(int size){
  10. if(size>0){
  11. capacity = size;
  12. elementData = new Object [size];
  13. }else{
  14. throw new IllegalArgumentException("集合初始化容量参数size传入非法值: "+
  15. size);
  16. }
  17.  
  18. }
  19. public boolean add(E o){
  20. if(size<capacity){
  21. elementData[size]=o;
  22. size++;
  23. return true;
  24. }else{
  25. return false;
  26. }
  27. }
  28. @SuppressWarnings("unchecked")
  29. public E remove(int index) {
  30. E oldValue = null;
  31. if(index>=0 && index<size){
  32. oldValue = (E) elementData[index];
  33. int numMoved = size - index - 1;
  34. if (numMoved > 0)
  35. System.arraycopy(elementData, index+1, elementData, index,
  36. numMoved);
  37. elementData[--size] = null; // clear to let GC do its work
  38. return oldValue;
  39. }else{
  40. return null;
  41. }
  42. }
  43. @SuppressWarnings("unchecked")
  44. public E get(int index){
  45. if(index>=0&&index<size){
  46. return (E) elementData[index];
  47. }else{
  48. throw new IllegalArgumentException("非法参数index: "+
  49. index);
  50. }
  51. }
  52. @Override
  53. public Iterator<E> iterator() {
  54. return new Itr();
  55. }
  56.  
  57. private class Itr implements Iterator<E> {
  58. int cursor; // index of next element to return
  59. int lastRet = -1; // index of last element returned; -1 if no such
  60. @Override
  61. public boolean hasNext() {
  62. return cursor != size;
  63. }
  64.  
  65. @SuppressWarnings("unchecked")
  66. @Override
  67. public E next() {
  68. int i = cursor;
  69. if (i >= size)
  70. throw new NoSuchElementException();
  71. cursor = i + 1;
  72. return (E) elementData[lastRet = i];
  73. }
  74. }
  75. }
  76.  
  77. 测试:
  78. public class Test {
  79. public static void main(String[] args) {
  80. //ArrayList a = new ArrayList(1);
  81. IterableClass<String> array = new IterableClass<String>(10);
  82. array.add("a");
  83. array.add("b");
  84. array.add("c");
  85. array.add("d");
  86. System.out.println(array.get(2));
  87. array.remove(2);
  88.  
  89. for(String s: array){
  90. System.out.println(s);
  91. }
  92. }
  93.  
  94. }
  95. 输出:
  96. c
  97. a
  98. b
  99. d

Iterable,Iterator和forEach的更多相关文章

  1. python中的Iterable, Iterator,生成器概念

    https://nychent.github.io/articles/2016-05/about-generator.cn 这个深刻 谈起Generator, 与之相关的的概念有 - {list, s ...

  2. 生成器(generator)和迭代(iterable , iterator, iteration)

    在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration 1.Iterable 我们知道,在Python中所有东西都是object, 比如说变量,容 ...

  3. java:集合输出Iterator,ListIterator,foreach,Enumeration

    //集合输出,集合的四种输出 Iterator, ListIterator, foreach, Enumeration 只要碰到集合,第一输出选择是Iterator类. Iterator<E&g ...

  4. JDK源码学习笔记——Iterable/Iterator实现原理

    Collection接口继承java.lang.Iterable接口,集合类重写了iterator()方法 public interface Iterable<T> { Iterator& ...

  5. java - day011 - 集合, ArrayList HashMap,HashSet, Iterator 接口, for-each 循环格式

    集合 ArrayList 丑数: 能被3,5,7整除多次, ArrayList     list 接口             | - ArrayList             | - Linked ...

  6. Python Iterable Iterator Yield

    可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list / tuple / dict / set / str /等(对于这类iterable的对象,因为你可以按照你的意愿进行重 ...

  7. Java集合框架(一)—— Collection、Iterator和Foreach的用法

    1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ...

  8. Iterable/Iterator傻傻分不清

    区别可迭代对象和迭代器 1.判断是否可以迭代 from collections import Iterabledef fid(times): n = 0 a , b = 0,1 while n < ...

  9. 为什么iterator,foreach遍历时不能进行remove操作?除了一种情况可以这样(特殊情况)?

    Exception in thread "main" java.util.ConcurrentModificationException 并发修改异常引发的思考! 1 foreac ...

随机推荐

  1. Redis笔记 -- make编译安装报错记录2则(一)

    1.Redis的获取与安装,目前最新稳定版本为4.0.10 Redis:  https://redis.io/download GitHub:  https://github.com/antirez/ ...

  2. c# 在WebBrowser中用SendMessage模拟鼠标点击

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. ThinkPHP5.1 前置操作说明

    可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法. ...

  4. Nginx中配置http和https做反向代理

    参考:http://www.zslin.com/web/article/detail/73 1.安装 sudo apt-get install nginx 2.配置: http_demo.conf # ...

  5. 20155334 2016-2017-2《Java程序设计》课程总结

    20155334 2016-2017-2<Java程序设计>课程总结 1. 每周作业链接汇总 题目 主要内容 二维码 预备作业1 不知道所以然的第一次博客 预备作业2 有关之前的C语言的调 ...

  6. CF 1093 E. Intersection of Permutations

    E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. ...

  7. STM8在IAR中Printf的整形长度问题

    //ld是32位的 printf("up_intval:%ld\r\n",device_set.upload_tem); //d是16位的 printf("up_intv ...

  8. 向大学说拜拜——大学 > 兴趣 + 时间 + 思考 + 实践

    [人物素描] 大学期间,担任过班委,加入过学生会,参加过社团,拿过奖学金......而印象最深刻的莫过于参加并组织过ACM集训,以及参加过导师的国家自然科学基金项目了.毕业时顺利拿到一波offer,并 ...

  9. kettle 将job等导入导出成xml

    一.导出 工具->资源库->探索资源库 就可以看见资源库里面的资源了. 如果要导出资源库里面的某个目录就右键就行了. 如果要导出全部资源库的文件就如下图所示 将资源库导出其实也是一个xml ...

  10. _INTSIZEOF

    在_INTSIZEOF中该有的都有了 1.这其中最小非负剩余和最大正余数例子如下: 设n为4,当r为1时,最小非负剩余就是1,最大非正剩余就是1 - 4 = -3,最大正余数为4 - 1 = 3 2. ...