当前位置: 代码迷 >> 编程 >> 黑马软件工程师 java Iterator foreach
  详细解决方案

黑马软件工程师 java Iterator foreach

热度:6627   发布时间:2013-02-26 00:00:00.0
黑马程序员 java Iterator foreach
----------android培训、java培训、java学习型技术博客、期待与您交流! ----------

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



  相关解决方案