for 循环的使用技巧
在程序设计中,经常要进行程序流程的控制,而在此过程中经常用到的就是for循环语句。for循环是编程语言最基本的内容,在最开始学习编程的时候就会学到,也是在编程过程中经常使用的。
这是一个很熟悉的内容,但是如何使用for循环使程序的效率更高。本文所要讲述的也就是在编程过程中for循环的一些使用技巧以及要注意的地方。
for循环的基本结构:
for( 初始化表达式;判断表达式;递增(递减)表达式){
执行语句;
}
这是for循环最基本的结构,也是一个完整的结构。在编程的过程中可以根据自己的需要灵活的使用for循环的其他的变形结构。
以下是for循环的几种常用结构:
// for循环的几种结构
for( int i = 0; i < 10; i++ ){
// do something
}
for( int i = 0; i < 10; ){
// do something
i++;
}
for( int i = 0;; i++ ){
if( i < 10 )
break;
// do something
}
int i = 0;
for( ; i < 10; i++ ){
// do something
}
for( int j = 0;; ){
if( j < 10 )
break;
// do something
j++;
}
for( ; i < 10; ){
// do something
i++;
}
for( ;; i++ ){
if( i < 10 )
break;
// do something
}
for( ;; ){
if( i < 10 )
break;
// do something
i++;
}
虽然for循环可以写成很多种的结构形式,但是一个for循环执行的基本流程是不变的。
for循环执行的基本流程:
第一步:执行初始化表达式。这个在整个for循环中只执行一次。
第二步:执行判断表达式。在每一次循环中都会执行,如果表达式为false,则结束循环。
第三步:执行递增(递减)表达式。这个在每一次循环的最后执行。
以上只是for循环的基本流程,具体的还要取决于你所书写的for循环的结构而定。
那么for循环在使用中有那些技巧呢?以下只是个人在开发使用中总结的一些内容。
for 循环的使用技巧
1、不要在判断表达式中使用方法调用
来看下面这个例子:
ArrayList<Object> list = new ArrayList<Object>( );
for( int i = 0; i < list.size( ); i++ ){
// do something
}
这个在编程的过程中,我们可能会经常这样写。这个for循环看起来很简洁也很清楚,但是这样有什么不好呢?
看一下它的判断表达式i < list.size( ),我们知道for循环的判断表达式在每一次的循环中都会执行一次,那么list.size( )这个方法的调用每一次也都要执行,这无形中就降低了程序的效率了,也是完全没有必要的。
我们不妨把它改成下面这个例子:
ArrayList<Object> list = new ArrayList<Object>( );
for( int i = 0, listSize = list.size( ); i < listSize; i++ ){
// do something
}
这里只是把list.size( )这个方法的调用放到了for循环的初始化表达式中,因为for循环的初始化表达式是只执行一次而已。
需要注意的一点是,在for循环的初始化表达式中是可以初始化多个变量的,在递增(递减)表达式中也可以有多个表达式,要以逗号间隔,而不是用分号。
如下面的例子:
for(int i=0, j=1, k=2; i<5 || j>6 && k<8; i++, j--, k=i+j){
// do something
}
如果你的JDK版本比较高的话,也可以用以下for循环的高级版本
ArrayList<Object> list = new ArrayList<Object>( );
for( Object object: list ){
// do something
}
2、不要在循环中创建临时对象
来看下面的这个例子:
for( int i = 0; i < 8888; i++ ){
Object object = new Object( );
// do something
}
从循环中可以看到,在每次执行for循环都要创建一个Object的临时对象,而创建一个对象就要占用一定的内存空间,虽然java有垃圾回收机制,但是这也是会在内存中存在很长时间的。
我们不妨把它改成下面这个例子:
Object obj = null;
for( int i = 0; i < 8888; i++ ){
obj = new Object( );
// do something
}
虽然也是在每一次的循环中都实例化一个对象,但是在内存中只保存一份对象的引用,而没有创建大量新的临时对象.从而降低了内存的使用
3、不要把与循环无关的流程放到for循环中执行
我们来看个简单的例子:
int a = 5;
int b = 8;
double[] d = new double[10];
for( int i = 0; i < 10; i++ ){
d[i] = d[i] / ( a * b );
}
我们不妨把它改成下面这个例子:
int a = 5;
int b = 8;
int c = a * b;
for( int i = 0; i < 10; i++ ){
d[i] = d[i] / c;
}
两个例子的对比,可以很清楚的看到,在第二个循环中把 ( a * b ) 放到了for循环的外部,也就只执行了一次。这里只是一个简单的表达式运算,如果是更多的执行语句,那么程序的效率也就会提高更多了。
4、不要让你的for循环变成死循环或者不循环
看下面的例子:
for( int i = 0; i > 10; i++ ){
// 不循环
}
for( int i = 0; i < 10; i-- ){
// 死循环
}
这些主要都是符号的书写错误造成的,只要在编程的注意检查自己的代码就可以。而且这种错误在程序单元测试的时候就很容易发现了。
5、不要让你的for循环执行不完全
来看一个例子:
ArrayList<Object> list = new ArrayList<Object>( );
for( int i = 1, listSize = list.size( ); i < listSize; i++ ){
// do something
}
在初始化表达式中i=1,而list的索引的从0开始的,这样就少了一个值取不到了,而且这种错误是不容易被发现的,因为程序不会报错,所以要特别注意。
也不要写成下面这种:
ArrayList<Object> list = new ArrayList<Object>( );
for( int i = 0, listSize = list.size( ); i <= listSize; i++ ){
// do something
}
判断表达式中i <= listSize使用了等于号,这将会产生下标的越界。
这些主要是在使用for循环的时候,注意循环的边界值,看自己什么时候需要从0开始循环,什么时候需要用等号,就不会出错了。
以上只是自己的一些总结,以后有更多的再补上。希望能给你的编程带来些帮助,也能提高你程序的运行效率。