这段代码分别以不同的方式实现了iterator()方法,实现了add()方法在末尾添加元素。自定义的Iterator对象具有hasNext()、next()、remove()方法。数组的拷贝用到了Arrays.copyOf方法,这个方法传回的数组是一个新的数组对象。
1 package com.bjsxt.iter; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Iterator; 6 7 /** 8 * 目标:深入迭代器的原理 --> 一个容器可以创建多个迭代器对象 9 * 途径:使用了 内部类 |匿名内部类 10 * 11 * 深入: 12 * 1.使用内部类 实现迭代器 13 * 2.使用Iterable 实现foreach迭代 14 * 3.加入末尾添加元素的方法 15 * 16 * 17 */ 18 public class SxtDeepList implements java.lang.Iterable{ 19 //数组 存储值 20 private String[] elem = new String[5]; 21 //实际大小 22 private int size = 0; 23 24 public int size() { 25 return this.size; 26 } 27 28 /** 29 * 在末尾添加元素 30 * @param ele 31 */ 32 public void add(String ele) { 33 if(this.size == elem.length) { //容量不够 --> 扩容 34 elem = Arrays.copyOf(elem, elem.length+5); 35 36 } 37 38 elem[size] = ele; //数组中加入元素 加到最后 39 size++;//实际大小+1 40 } 41 42 //内部类 43 private class MyIter implements Iterator { 44 //计数器 就是指针 游标 45 private int cursor = -1; 46 //判断是否存在下一个 47 public boolean hasNext() { 48 return cursor+1 < size; 49 } 50 //获取下一个 51 public String next() { 52 cursor++; 53 return elem[cursor]; 54 } 55 //删除下一个 56 public void remove() { 57 //移动数组元素 58 System.arraycopy(elem, 59 cursor+1, elem, cursor, 60 size-(cursor+1)); 61 //实际大小-1 62 size--; 63 //回退 64 this.cursor--; 65 } 66 } 67 68 public Iterator iterator1() { 69 return new MyIter(); 70 } 71 72 public Iterator iterator2() { 73 class MyIter implements Iterator { 74 //计数器 就是指针 游标 75 private int cursor = -1; 76 //判断是否存在下一个 77 public boolean hasNext() { 78 return cursor+1 < size; 79 } 80 //获取下一个 81 public String next() { 82 cursor++; 83 return elem[cursor]; 84 } 85 //删除下一个 86 public void remove() { 87 //移动数组元素 88 System.arraycopy(elem, 89 cursor+1, elem, cursor, 90 size-(cursor+1)); 91 //实际大小-1 92 size--; 93 //回退 94 this.cursor--; 95 } 96 } 97 return new MyIter(); 98 } 99 100 public Iterator iterator() { 101 return new Iterator() {//创建Iterator迭代器接口实现类(没有名称)的对象 102 //计数器 就是指针 游标 103 private int cursor = -1; 104 //判断是否存在下一个 105 public boolean hasNext() { 106 return cursor+1 < size; 107 } 108 //获取下一个 109 public String next() { 110 cursor++; 111 return elem[cursor]; 112 } 113 //删除下一个 114 public void remove() { 115 //移动数组元素 116 System.arraycopy(elem, 117 cursor+1, elem, cursor, 118 size-(cursor+1)); 119 //实际大小-1 120 size--; 121 //回退 122 this.cursor--; 123 } 124 }; 125 } 126 127 public static void main(String[] args) { 128 SxtDeepList list = new SxtDeepList(); 129 list.add("a"); 130 list.add("b"); 131 list.add("c1"); 132 list.add("c2"); 133 list.add("c3"); 134 list.add("c4"); 135 list.add("c5"); 136 Iterator it = list.iterator(); 137 while(it.hasNext()) { //先判断 后获取 138 System.out.println(it.next()); 139 it.remove(); 140 } 141 System.out.println(list.size()); 142 143 for(Object str:list) { 144 System.out.println(str); 145 } 146 147 148 ArrayList list2 = new ArrayList(); 149 list2.add("a"); 150 list2.add("a"); 151 list2.add("a"); 152 for(Object obj:list2) { //foreach 153 System.out.println(obj); 154 } 155 } 156 }