JDK1.5加入的增强for和循环.

foreach语句使用总结

增强for(part1:part2){part3};

part2中是一个数组对象,或者是带有泛性的集合. 
part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的. 
part3当然还是循环体.

 
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;

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仅仅老老实实地遍历数组或者集合一遍。下面看一个例子就明白了:
 
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语句的时候了。foreach一般结合泛型使用

Java 中新增的 foreach 的用法的更多相关文章

  1. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  2. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  3. java中 this 的三种用法

    Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...

  4. Java中枚举的写法和用法

            在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法         关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代 ...

  5. Java中try,catch,finally的用法

    Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch  运行流程:运行到try ...

  6. 关于java中for和foreach循环

    for循环中的循环条件中的变量只求一次值!具体看最后的图片 foreach语句是java5新增,在遍历数组.集合的时候,foreach拥有不错的性能. foreach是for语句的简化,但是forea ...

  7. ES5中新增的forEach等新方法的一些使用声明

    转载地址:http://www.zhangxinxu.com/wordpress/?p=3220 一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块, ...

  8. java中super的两种用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  9. Java中super的几种用法并与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...

随机推荐

  1. Python缩小图像

    LyncLynn用途: 缩小图像 # -*- coding: UTF-8 -*- #Version: V1.0 #Author:lynclynn #CreateDate:20151201 #Updat ...

  2. 【OpenCV】直方图

    今天写直方图,学了几个相关函数 1. mixChannels void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const ...

  3. powerdesigner新建模型教程

    1.现在开始使用PowerDesigner创建数据库,首先运行程序,进入主界面:

  4. .net在当前日期的基础上加一天

    比如今天是:2015-11-10 18:57:01,在这个基础上加一天,那么就是2015-11-11 18:57:01,代码如下: DateTime now_dt = DateTime.Now; ). ...

  5. MFC 使用MFC EditBrowse Control控件选择文件或者文件夹

    从工具箱中拖拽一个MFC EditBrowse Control到窗体中, 通过设置“Browse Mode”属性指定“文件浏览”还是“文件夹浏览” 可以通过添加对象的方式将其与一个CString se ...

  6. supersr--图形上下文的注意点

    - (void)test { // 不要自己调用drawRect:方法的原因: // 当系统调用drawRect:方法之前, 会创建一个与当前UIView的layer相关的图形上下文, 这样就可以保证 ...

  7. osgi学习

    Bundle可以被动态地安装.启动.停止和卸载.Bundle是服务(Service)和组件(Component)的载体.在OSGi中,每个Bundle都有自己独立于其他Bundle的ClassLoad ...

  8. 词频统计_输入到文件_update

    /* 输入文件见337.in.txt 输出文件见338.out.txt */ #include <iostream> #include <cctype> #include &l ...

  9. MongoDB csv文件导入导出

    1.导出到csv文件: 2.从csv导入: 数据经过csv导出导入,有一个非常隐蔽的问题,编写代码时需要注意: 先导入一条数据: 其中Price是double类型: 然后我把该条记录导出到Demo.c ...

  10. Git 操作的一些场景

    1. 某些不需要的文件/文件夹,如:/build 之类,在添加对应的gitignore之前Push了,导致每次编译都会产生新的文件 解决方法:直接删掉不需要的文件/文件夹,然后push gitigno ...