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