Java Foreach语句使用总结

foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。

foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。

foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。

foreach的语句格式:

for(元素类型t 元素变量x : 遍历对象obj){

引用了x的java语句;

}

下面通过两个例子简单例子看看foreach是如何简化编程的。代码如下:

一、foreach简化数组和集合的遍历

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList; 

/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-12-3
* Time: 16:58:24
* Java5新特征之foreach语句使用总结
*/
public class TestArray {
    public static void main(String args[]) {
        TestArray test = new TestArray();
        test.test1();
        test.listToArray();
        test.testArray3(); 

    } 

    /**
     * foreach语句输出一维数组
     */
    public void test1() {
        //定义并初始化一个数组
        int arr[] = {2, 3, 1};
        System.out.println("----1----排序前的一维数组");
        for (int x : arr) {
            System.out.println(x); //逐个输出数组元素的值
        } 

        //对数组排序
        Arrays.sort(arr); 

        //利用java新特性for each循环输出数组
        System.out.println("----1----排序后的一维数组");
        for (int x : arr) {
            System.out.println(x); //逐个输出数组元素的值
        }
    } 

    /**
     * 集合转换为一维数组
     */
    public void listToArray() {
        //创建List并添加元素
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("3");
        list.add("4"); 

        //利用froeach语句输出集合元素
        System.out.println("----2----froeach语句输出集合元素");
        for (String x : list) {
            System.out.println(x);
        } 

        //将ArrayList转换为数组
        Object s[] = list.toArray(); 

        //利用froeach语句输出集合元素
        System.out.println("----2----froeach语句输出集合转换而来的数组元素");
        for (Object x : s) {
            System.out.println(x.toString()); //逐个输出数组元素的值
        }
    } 

    /**
     * foreach输出二维数组测试
     */
    public void testArray2() {
        int arr2[][] = {{4, 3}, {1, 2}};
        System.out.println("----3----foreach输出二维数组测试");
        for (int x[] : arr2) {
            for (int e : x) {
                System.out.println(e); //逐个输出数组元素的值
            }
        }
    } 

    /**
     * foreach输出三维数组
     */
    public void testArray3() {
        int arr[][][] = {
                {{1, 2}, {3, 4}},
                {{5, 6}, {7, 8}}
        }; 

        System.out.println("----4----foreach输出三维数组测试");
        for (int[][] a2 : arr) {
            for (int[] a1 : a2) {
                for (int x : a1) {
                    System.out.println(x);
                }
            }
        }
    }
}

运行结果:

----1----排序前的一维数组

2

3

1

----1----排序后的一维数组

1

2

3

----2----froeach语句输出集合元素

1

3

4

----2----froeach语句输出集合转换而来的数组元素

1

3

4

----4----foreach输出三维数组测试

1

2

3

4

5

6

7

8

Process finished with exit code 0

二、foreach语句的局限性

通过上面的例子可以发现,如果要引用数组或者集合的索引,则foreach语句无法做到,foreach仅仅老老实实地遍历数组或者集合一遍。下面看一个例子就明白了:

/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2007-12-3
* Time: 17:07:30
* foreach语句的局限性
*/
public class TestArray2 { 

    public static void main(String args[]) {
        //定义一个一维数组
        int arr[] = new int[4];
        System.out.println("----未赋值前输出刚刚定义的数组----");
        for (int x : arr) {
            System.out.println(x);
        } 

        //通过索引给数组元素赋值
        System.out.println("----通过循环变量给数组元素赋值----");
        for (int i = 3; i > 0; i--) {
            arr[i] = i;
        }
        //循环输出创建的数组
        System.out.println("----赋值后,foreach输出创建好的数组----");
        for (int x : arr) {
            System.out.println(x);
        }
    }
}

运行结果:

----未赋值前输出刚刚定义的数组----

0

0

0

0

----通过循环变量给数组元素赋值----

----赋值后,foreach输出创建好的数组----

0

1

2

3

Process finished with exit code 0

三、总结

foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了。在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的时候了。

以上出自 “
” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/53321

例:对比两种for循环;之后实现了用增强for循环遍历二维数组;最后采用三种方式遍历了一个List集合。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ForeachTest
{
    public static void main(String[] args)
    {
        int[] arr = {1, 2, 3, 4, 5};

        System.out.println("----------旧方式遍历------------");
        //旧式方式
        for(int i=0; i<arr.length; i++)
        {
            System.out.println(arr[i]);
        }

        System.out.println("---------新方式遍历-------------");

        //新式写法,增强的for循环
        for(int element:arr)
        {
            System.out.println(element);
        }

        System.out.println("---------遍历二维数组-------------");

        //遍历二维数组

        int[][] arr2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} ;

        for(int[] row : arr2)
        {
            for(int element : row)
            {
                System.out.println(element);
            }
        }

        //以三种方式遍历集合List

        List<String> list = new ArrayList<String>();

        list.add("a");
        list.add("b");
        list.add("c");

        System.out.println("----------方式1-----------");
        //第一种方式,普通for循环
        for(int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));

        }

        System.out.println("----------方式2-----------");
        //第二种方式,使用迭代器
        for(Iterator<String> iter = list.iterator(); iter.hasNext();)
        {
            System.out.println(iter.next());
        }
        System.out.println("----------方式3-----------");
        //第三种方式,使用增强型的for循环
        for(String str: list)
        {
            System.out.println(str);

        }
    }

}

由此可见,For-Each循环的缺点:丢掉了索引信息。

  当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息。

参考:java forEach实现原理 http://blog.csdn.net/a596620989/article/details/6930479

java 关于for和foreach,兼顾效率与安全 http://flyvszhb.iteye.com/blog/2163569

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 10:40:10

Java Foreach语句使用总结的相关文章

Java之Foreach语句

Foreach是for语句的特殊简化版本,但任何时候的foreach语句都可以改写成for语句.Foreach语句在遍历数组等方面为程序员提供了很大的方便 语法如下: For(元素变量 x:遍历对象obj){ 引用了x的java语句 } 实例: package Foreach1; public class Foreach1 { public static void main(String[] args) { int [] arr={1,3,5,7,9,11,13,15};    //声明一维数组

【Java学习笔记】foreach语句(高级for)

1 package p2; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 public class ForEachDemo { 9 10 public static void main(String[] args) { 11 /* 12 * foreach语句: 13 * 格式: 14 * for(类型 变量 : Co

Java中的可变参数以及foreach语句

Java中的可变参数的定义格式如下: 返回值类型  方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型  变量名称 :数据名称){ ... } public class NewDemo01 { public static void main(String[] args) { // TODO Auto-generated method stub fun(); fun(1); fun(1,2,3,4); } public static void fun(in

【JAVA】foreach语句 -- for(int I : nums){}

简述: foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本. foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为"foreach"语句.从英文字面意思理解foreach也就是"for 每一个"的意思.实际上也就是这个意思. foreach的

java foreach实现原理

java  foreach 语法糖实现原理 一 .  示例代码 1 import java.util.ArrayList; 2 import java.util.List; 3 4 /** 5 * 6 * @author lulei 7 * @date 2014-9-23 8 * 9 */ 10 public class TestForeach { 11 12 private List<String> list = new ArrayList<String>(); 13 priva

Java foreach

foreach循环也叫增强型的for循环,或者叫foreach循环. foreach循环是JDK5.0的新特性(其他新特性比如泛型.自动装箱等). import java.util.Arrays; public class Main { public static void main(String[] args) { int arr[] = new int[4]; for (int x : arr) { System.out.println(x); } for (int i = 3; i > 0

为什么数组没有实现Iterable接口,但可以使用foreach语句遍历

在Java中,对于数组为什么能够使用foreach语句一直感觉很困惑. 对于能够使用foreach语句进行遍历的对象,只有两种情况,其中一种是遍历对象必须实现Iterable接口,实现ierator()方法,这是对象使用foreach语句的前提.另外一种情况就是特殊对象数组.那么对于数组可以使用foreach该如何去理解呢? 首先需要说明的是,实现了java.lang.Iterable接口的对象可以用for-each去遍历,但是能用for-each去遍历的不一定实现了该接口,比如数组这个特殊对象

foreach语句

foreach语句他无非就是for循环的封装,为了提高开发速度才创造出来的.他其实跟for循环一样,只不过写起来比较简便,他是1.5版本才出来的一种封装语法.并没有什么奇特之处他里面的机制就是for循环.如图7.3所示: 图7.3 首先放在冒号后面的,他可以是数组的类型也可以是集合类型还可以是枚举类型,也就是说只要写上类似于这种容器,能够容乃多个的就是行. 那这个i是什么意思呢?每次循环的时候,i他取出一个值交给变量j,变量j就是接收者,接收从数组或者集合里拿出来的值交给接收者,每次循环重新接收

java 块语句 和引用类型

1.java中存在块语句,块语句分为四种 1.静态块 2.普通块 3.构造块 4.同步块 静态块的执行时机是在class文件装载的时候;静态块只会执行一次, 多个静态块的时候,按出现顺序执行,存放类的信息,用来在生成类之前进行的初始化,对一些static 变量赋值.如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的. 普通块存在于方法体中,用于设置变量的作用域, 构造块,初始对象信息,每创建一个对象,初始化一次,先于构造器执行 当一个类有很多个构造方法,每