foreach概述
for/in
循环通常叫作增强的for或者foreach,它是Java5.0中一个极为方便的特性。
以下是编译器把该循环转换成普通的for
循环之后,语句实际看起来的样子:
编译前:
for( 声明: 表达式) 语句
编译后:
for (Iterator< E> #i = ( expression).iterator(); #i.hasNext(); ) { declaration = #i.next(); statement}
foreach/Iterator
都说foreach是专门为迭代器配置的,为什么?看看
for(typex: exp) loop-body;中的exp必须是数组,或者是实现了Iterable接口的类。
一个Iterable对象中必然内嵌了Iterator迭代器。
java.
util
.Iterator
接口:
package java.util;public interface Iterator<E> { public boolean hasNext(); public E next(); public void remove();}
java.
lang
.Iterable
接口
:
package java.lang;public interface Iterable<E> { public java.util.Iterator<E> iterator();}
foreach
的局限性
1.
不能确定您在列表或数组(或者定制对象)中的位置
。(
因为没有用索引变量
)
2.
没有办法在遍历期间进行项目删除。(和1
的原因是一样的)
自定义遍历
import java.util.Iterator;class Link_List<T extends Comparable>{// 限制了这个泛型容器必须是放实现了Comparable的元素 private Node headNode,tailNode; public Link_List(){// 构造函数 headNode=tailNode=null; } public void add(T x){ Node p=new Node(x); if(isEmpty()){ headNode=tailNode=p; }else{ tailNode.next=p; tailNode=p; } } public boolean isEmpty(){ // 是否为空链表 if(headNode!=null){ return false; } return true; } public void printList(){ for(T x: headNode){ System.out.print(x +"=="); } } public Node head(){ return headNode; } /** * Node */ private class Node implements Iterable<T>{ public T data; // 数据域 public Node next; // 指针域 public Node(T x){// Node构造函数 this.data=x; } @Override public Iterator<T> iterator() { //构造迭代器 // TODO Auto-generated method stub //return null; return new Itr(); } } /** * Itr */ private class Itr implements Iterator<T>{ //构造迭代器就是实现Iterator接口中的所有方法 private Node cur=headNode; @Override public boolean hasNext() { // TODO Auto-generated method stub //return false; return (cur!=null); } @Override public T next() { // TODO Auto-generated method stub //return null; Node p=cur; cur=cur.next; return p.data; } @Override public void remove() { // TODO Auto-generated method stub } }}public class CH_11_5 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Link_List<Integer> ls1=new Link_List<>(); for(int i=1; i<10; i++){ ls1.add(i); } ls1.printList(); double d1=sum(ls1); System.out.println("\n 累加和是:"+d1); } public static double sum(Link_List<? extends Number> ls){ // 注意理解通配符的应用方法 double sum=0; for(Number n: ls.head()){ sum+=n.doubleValue(); } return sum; }}