1、foreach介绍及其使用范围
foreach语句是java5的新特征之一,在遍历数组、集合、Iterable对象方面,为开发人员提供了极大的方便。foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。foreach语法支持对数组、Collection对象、Iterable对象的遍历。
2、foreach适用于对数组遍历
String[] array = {"A","B","C","D","E","F","G"}; for(String str:array){ System.out.print(str+" "); }
3、foreach适用于对Collection对象遍历
import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.TreeSet; public class ForeachDemo { public static void main(String[] args) { String[] array = {"A","A","B","E","F","G","C","D"}; Collection<String> list = new ArrayList<String>(Arrays.asList(array)); for(String str:list){////按照被添加的顺序保存对象 System.out.print(str+" "); } System.out.println(); Collection<String> linkedList = new LinkedList<String>(Arrays.asList(array)); for(String str:linkedList){//按照被添加的顺序保存对象 System.out.print(str+" ");//A A B E F G C D } System.out.println(); Collection<String> hashSet = new HashSet<String>(Arrays.asList(array)); for(String str:hashSet){//无重复,无序,存储顺序并无实际意义 System.out.print(str+" ");//D E F G A B C } System.out.println(); Collection<String> treeSet = new TreeSet<String>(Arrays.asList(array)); for(String str:treeSet){//无重复,按照比较结果的升序保存对象 System.out.print(str+" ");//A B C D E F G } System.out.println(); Collection<String> linkedHashSet = new LinkedHashSet<String>(Arrays.asList(array)); for(String str:linkedHashSet){//无重复,按照被添加的顺序保存对象 System.out.print(str+" ");//A B E F G C D } } }
代码优化,利用上转型抽象出公共方法:
public static void forEachCollection(Collection<String> colleciton){ for(String str:colleciton){////按照被添加的顺序保存对象 System.out.print(str+" "); } System.out.println(); }
测试用例:
public static void listCollection() { String[] array = {"A","A","B","E","F","G","C","D"}; forEachCollection(new ArrayList<String>(Arrays.asList(array)));//A A B E F G C D forEachCollection(new LinkedList<String>(Arrays.asList(array)));//按照被添加的顺序保存对象 //A A B E F G C D forEachCollection(new HashSet<String>(Arrays.asList(array)));//无重复,无序,存储顺序并无实际意义//D E F G A B C forEachCollection(new TreeSet<String>(Arrays.asList(array)));//无重复,按照比较结果的升序保存对象//A B C D E F G forEachCollection(new LinkedHashSet<String>(Arrays.asList(array)));//无重复,按照被添加的顺序保存对象//A B E F G C D }
3.1、利用迭代遍历Collection对象:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.TreeSet; public class ForeachDemo { public static void printCollection(Collection<String> colleciton){ Iterator<String> it = colleciton.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } System.out.println(); } public static void main(String[] args) { String[] array = {"A","A","B","E","F","G","C","D"}; printCollection(new ArrayList<String>(Arrays.asList(array)));//A A B E F G C D printCollection(new LinkedList<String>(Arrays.asList(array)));//按照被添加的顺序保存对象 //A A B E F G C D printCollection(new HashSet<String>(Arrays.asList(array)));//无重复,无序,存储顺序并无实际意义//D E F G A B C printCollection(new TreeSet<String>(Arrays.asList(array)));//无重复,按照比较结果的升序保存对象//A B C D E F G printCollection(new LinkedHashSet<String>(Arrays.asList(array)));//无重复,按照被添加的顺序保存对象//A B E F G C D } }
4、foreach适用于对Iterable对象遍历:
package com.andieguo.iterabledemo; import java.util.Iterator; public class IteratorSequence<T> { private T[] array = null; public IteratorSequence(T[] array){ this.array = array; } public Iterable<T> iterator(){//Iterable能够用于foreach return new Iterable<T>(){ @Override public Iterator<T> iterator() { // TODO Auto-generated method stub return new Iterator<T>() { private int index = 0; @Override public boolean hasNext() { // TODO Auto-generated method stub return index < array.length; } @Override public T next() { // TODO Auto-generated method stub return array[index++]; } @Override public void remove() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } }; }}; } public static void main(String[] args) { IteratorSequence<String> iteratorSequence = new IteratorSequence<String>(new String[]{"A","B","C"}); for(String str:iteratorSequence.iterator()){//iteratorSequence.iterator()返回的是一个Iterable<T>实例,支持foreach循环 System.out.print(str+" "); } } }