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;
}
}