转自:suremake
for/in循环就是JDK5.0中所谓的增强For循环,它能对数组和集合进行遍历,使用它会使用你的代码短小而精炼的多。这里将介绍以下内容:
传统的for循环和增强for循环的比较
定制自己的增强for循环
增强for循环的局限性
一:传统的for循环和增强for循环的比较
//传统的数组遍历
String[] persons={“张三”,”李四”,”王五”};
for(int i=0;i<persons.length;i++){
System.out.println(persons[i]);
}
//使用增强for循环的数组遍历
String[] persons={“张三”,”李四”,”王五”};
for(String person:persons){
System.out.println(person);
//传统的Iterator遍历集合
List<String> persons=new ArrayList<String>();
persons.add(“张三”);
persons.add(“李四”);
persons.add(“王五”);
for(Iterator<String> i=persons.iterator();i.hasNext();){
String person=i.next();
System.out.println(person);
}
//使用增强For循环遍历集合
List<String> persons=new ArrayList<String>();
persons.add(“张三”);
persons.add(“李四”);
persons.add(“王五”);
for(String person:persons){
System.out.println(person);
}
可以看到使用增强for循环使得代码变得短小而精炼的多,如果你觉得这点变化还体现不出来,可以忍受,那你可以试试嵌套for循环,就会感觉到增强for循环的好处了,这里就不贴代码了。
二:定制自己的增强for循环
众所周知,增强for循环是按数组或者集合的内在顺序输出的,如果我们想在遍历的时候定制行为怎么做呢?下面就以一个逆序输出的例子说明怎么定制自己的增强for循环。
要想使用增强for循环,必须实现Iterable接口。
import java.util.Iterator;
/**
* 一个简单的逆序输出增强for循环
* @author
*
*/
public class ReverIterableClass<T> implements Iterable<T> {
protected T[] elements;
public ReverIterableClass(T… elems) {
this.elements=elems;
//this.object=(T[])new Object[ts.length];
}
public Iterator<T> iterator() {
return new Iterator<T>(){
private int current=elements.length-1;
public boolean hasNext() {
return current>-1;
}
public T next() {
return elements[current–];
}
public void remove() {
throw new UnsupportedOperationException(“目前不支持删除操作”);
}
};
}
public static void main(String[] args){
ReverIterableClass<String> iterableClass=new ReverIterableClass<String>(“a”,”b”,”c”,”d”);
for(String s:iterableClass){
System.out.println(s);
}
}
}
在这个程序里我们定制了自己的输出行为–逆序输出,当然你也可以定义属于你自己的,只需要在next()函数里写处理代码即可。
三:增强for循环的局限性
不能在增强for循环中访问位置,例如下面的代码:
String[] persons={“张三”,”李四”,”王五”};
for(int i=0;i<persons.length;i++){
System.out.println(i+”:”+persons[i]);
}
在增强for循环中你是得不到这个位置”i”的。
例如还有我们常用的在组合sql语句,select字段的时候,当是最后一个字段时,不能加”,”的。
String[] fields={“name”,”age”,”sex”};
StringBuilder sql=new StringBuilder(“select “);
for(int i=0;i<fields.length;i++){
if(i<fields.length-1){
sql.append(fields[i]+”,”);
}else{
sql.append(fields[i]);
}
}
sql.append(” from t_user”);
System.out.println(sql);
这在增强for循环中也是不能处理的。。
还有对元素的删除,在增强for循环中也不能做到,但是使用传统的Iterator接口遍历时就可以使用他的remove()方法删除符合条件的元素。
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
四:小结
增强for循环有它的好处,比如简洁,代码优雅,如果能使用增强for循环,一定要优先使用。
今天的文章Java高级特性之增强for循环分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65467.html