java基礎:增強for循環

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

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章