任何容器类,都必须有某种方式可以插入元素并将它们再次取回。毕竟,持有事物是容器最基本的工作。 对于List, add0是插入元素的方法之一,而get()是取出元素的方法之一。
如果从更高层的角度思考,会发现这里有个缺点:要使用容器,必须对容器的确切类型编程。 初看起来这没什么不好,但是考虑下面的情况:如果原本是对着List编码的, 但是后来发现如果能够把相同的代码应用于Set,将会显得非常方便,此时应该怎么做?或者打算从头开始编写通用的代码, 它们只是使用容器,不知道或者说不关心容器的类型,那么如何才能不重写代 码就可以应用于不同类型的容器?
迭代器(也是一种设计模式)的概念可以用于达成此目的。 迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。 此外,迭代器通常被称为轻量级对象: 创建它的代价小。 因此, 经常可以见到对迭代器有些奇怪的限制, 例如,Java的Iterator 只能单向移动,这个Iterator 只能用来:
(1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
(2)使用next()获得序列中的下一个元素。
(3)使用hasNext()检查序列中是否还有元素。
(4)使用remove()将选代器新近返回的元素删除.
有了Iterator就不必为容器中元素的数量操心了,那是由hasNext()和next()关心的事情。 如果你只是向前遍历List,并不打算修改List对象本身,那么你可以看到foreach语法会显得更加简练。
Iterator还可以移除由next()产生的最后一个元素,这意味着调用remove()之前必须首先调用Next()方法。
接受对象容器并传递它,从而在每个对象上都执行操作,这种思想很强大。
Listlterator 是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。尽管 Iterator只能向前移动,但是Listlterator 可以双向移动。它还可以产生相对于选代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。你可以通过调用listlterator()方法产生一个指向List开始处的Listlterator,并且还可以通过调用listlterator(n)方法创建一个一开始就指向列表索引为n的元素处的Listlterator。
(1)Foreach 遍历集合元素
1 public class ForeachDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 /* 9 * JDK1.5特性: 10 * 增强for循环。作用:用于遍历Collection集合or数组。 11 * 格式: 12 * for(元素类型 变量 :Collection容器or数组) 13 * { 14 * } 15 * 16 * 传统for循环和增强for循环有什么区别呢? 17 * 增强for必须有被遍历的目标。该目标只能是Collectionor数组。 18 * 19 */ 20 21 Collection coll = new ArrayList(); 22 23 coll.add("abc1"); 24 coll.add("abc2"); 25 coll.add("abc3"); 26 27 for(Object obj : coll){ 28 System.out.println(obj); 29 } 30 /* 31 for (Iterator it = coll.iterator(); it.hasNext();) { 32 Object obj = it.next(); 33 System.out.println(obj); 34 35 }*/ 36 //对于数组的遍历,如果不操作其角标,可以使用增强for,如果要操作角标。使用传统for。 37 int[] arr = {23,15,32,78}; 38 for(int x : arr){ 39 System.out.println("x="+x); 40 } 41 42 43 } 44 45 }
(2)ListIterator遍历List元素
1 public class ListIteratorDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 List list = new ArrayList(); 9 10 list.add("abc1"); 11 list.add("abc2"); 12 list.add("abc3"); 13 list.add("abc4"); 14 15 16 /* 17 //在遍历的过程中,如果遍历到abc2,添加一个元素haha 18 for (Iterator it = list.iterator(); it.hasNext();) { 19 Object obj = it.next();//java.util.ConcurrentModificationException 20 21 //迭代过程中使用了使用了集合对象同时对元素进行操作。导致了迭代的不确定性。引发了该异常。 22 //解决思想:在迭代过程中,想要执行一些操作,使用迭代器的方法就可以了。 23 24 if(obj.equals("abc2")){ 25 list.add("haha"); 26 } 27 }*/ 28 29 // 使用list集合的特有的迭代器。ListIterator 通过List集合的方法listIterator()获取该迭代器对象。 30 // ListIterator可以实现在迭代过程中的增删改查。 31 for (ListIterator it = list.listIterator(); it.hasNext();) { 32 Object obj = it.next(); 33 34 if(obj.equals("abc2")){ 35 it.add("haha"); 36 } 37 38 } 39 40 System.out.println(list); 41 } 42 43 }
2018-01-04
内容来自传智播客课程