MyException - 我的异常网
当前位置:我的异常网» 编程 » 黑马软件工程师 java Iterator foreach

黑马软件工程师 java Iterator foreach

www.MyException.Cn  网友分享于:2013-02-20  浏览:4次
黑马程序员 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;
	}

}



文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有